题目:实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
解决方法:使用两个栈_data和_min,_min做为辅助栈(每次压入_min的都是_data的最小值)。元素value入栈时,将value和_min栈顶元素做比较,如果value小于等于_min.top(),将value分别push到_data和_min,否则vlaue只push到_data;元素出栈时,将_data栈顶元素和_min栈顶元素做比较,如果_data.top()等于_min.top(),_data和_min都执行pop操作,否则只执行_data.pop() 。
#include <iostream>
#include <stack>
using namespace std;
template <typename T>class Stack
{
public:
Stack()
{}
~Stack()
{}
T& top()
{
return _data.top ();
}
const T& top()const
{
return _data.top ();
}
void push(const T& value)
{
//把新元素添加到辅助栈
_data.push (value);
//当新元素比之前的最小元素小时,把新元素插入到辅助栈里
//否则把之前的最小元素重复插入辅助栈里
if(_min.size () == 0 || value < _min.top ())
_min.push (value);
else
_min.push (_min.top());
}
void pop()
{
if(_data.size () > 0 && _min.size () > 0)
return ;
_data.pop ();
_min.pop ();
}
const T& min()const
{
if(!_min.empty ())
return _min.top ();
}
bool empty()const
{
return _data.empty ();
}
size_t size()const
{
return _data.size ();
}
void Print()
{
while(!_data.empty ())
{
cout<<_data.top ()<<"->";
_data.pop ();
}
cout<<endl;
while(!_min.empty ())
{
cout<<_min.top ()<<"->";
_min.pop ();
}
cout<<endl;
}
private:
stack<T> _data;
stack<T> _min;
};
int main()
{
Stack<int> s;
s.push (1);
s.push (2);
s.push (3);
s.push (4);
s.push (5);
s.push (6);
s.Print ();
return 0;
}