分析:栈的出栈和入栈操作都是时间复杂度O(1)的,问题主要是如何获得栈中所有元素的最小值。其实如果问题是数组中存入很多元素,取出元素中的最小值,时间O(1),那很简单,就是设置一个变量,每次存入数据的时候都和最小值变量比较,到最后取此变量值即可。但是在栈中,我们要求不管push或者pop多少次,此时直接取最小值要求依然O(1)。也很简单,在我们存数据的数据栈之外弄一个辅助栈,每次数据存入数据栈时,都将当前最小的值存入到辅助栈中(下面代码实现时进行了一点优化)。具体看如下代码。
#include<iostream>
#include<stack>
using namespace std;
template <class T>
class StackWithMin{
public:
void Push(const T data){ //进栈函数
_num.push(data);
if(_min.empty()||data<=_min.top()) //辅助栈为空,或者有更小的值,将其存入辅助栈。注意是 <=
_min.push(data);
}
void Pop(){
if(_num.top()==_min.top()) //数据栈当前取出的元素是栈中最小的,则辅助栈也要弹出此元素
_min.pop();
_num.pop();
}
T Min(){ //取当前最小元素
if(!_min.empty())
return _min.top();
}
private:
stack<T> _num; //数据栈
stack<T> _min; //辅助栈
};
int main(){
StackWithMin<int> s;
s.Push(4);
s.Push(3);
s.Push(5);
s.Push(2);
cout<<s.Min()<<endl;
s.Pop();
cout<<s.Min()<<endl;
return 0;
}
输出:
2
3
示意图: