【剑指offer】实现包含min函数的栈

    xiaoxiao2021-03-25  66

    摘要

    剑指offer面试题 21 :实现一个一个带有min函数的栈 这个栈包含一个min函数 --- 该函数能够得到栈的最小元素,,,,但是有一个要求,,,,,push、pop、min函数的时间复杂度为 O(1);

    实现方法

    要 想得到最小元素,,,,并且时间复杂度为 O(1),,,那么就必须要在栈顶保存的是最小元素,,,, 接下来,我们要来一一考虑其中的问题  : 1、首先、我们需要在栈顶,保存每次的最小元素;; 2、每次压入一个新的元素之后,,,要是这个元素比当前的最小元素还小的话 ,,,那么就要更新最小元素;; 3、每次pop一个元素的话,,,如果是最小元素,,,那么就要更新最小元素,,,否则不变化。。。。 3、想到此处之后,,,,我们需要建立一个辅助栈,,,在栈顶来保存每次的最小值; 使用一个测试用例来判断: 假设要压栈的序列为  {2,4,1,5,3}; 代码的实现 #pragma once //剑指offer 面试题21 //包含min函数的栈 //题目就是 : //定义栈的数据结构 ,,,在栈中实现一个能够实现得到栈的最小元素的min函数 。 //在这个栈中 ,,,push ,,pop、、、min的时间复杂度 都是 O(1); #include<vector> template<class T> class Stack { public: Stack() {} //插入时,,,,处理辅助栈,,,保持最顶端的位置始终是最小值 void push(const T& data) { _a.push_back(data);//尾插数据到数据栈 if(!_min.empty())//处理辅助栈 { //要是 插入的元素,,,比 当前的最小值小,,,,说明最小值 变了 ,,, if(data <= _min[_min.size()-1]) { _min.push_back(data);//将此元素作为是 最小值放到辅助栈中 } //否则 将原来的数继续放到顶端,,,, else { _min.push_back(_min[_min.size()-1]);//保存原最小值 } } else { _min.push_back(data); } } void pop() { _a.pop_back(); _min.pop_back(); } T& min() { return _min[_min.size()-1]; } T& top() { return _a[_a.size()-1]; } protected: vector<T> _a;//数据保存 vector<T> _min;//保存的是最小元素 }; void Test21th() { Stack<int> s; s.push(3); s.push(4); s.push(2); s.push(1); s.push(0); }
    转载请注明原文地址: https://ju.6miu.com/read-36484.html

    最新回复(0)