思路:我们如果直接用一个stack那么每次求最小值肯定得遍历一遍栈复杂度为O(n),我们可以用一个mstack和一个dstack来实现O(1)的复杂度,具体操作入栈时对于mstack来说,先判断mstack是否为空,若为空直接将元素插入mstack,若不为空,如果元素小于mstack栈顶元素入栈,否则不入,出栈时判断出栈元素是否等于mstack栈顶元素,若等于则出栈,否则不出。对于dstack来说就跟普通的入栈出栈操作一样。而要取得栈中的最小值,直接返回mstack栈顶元素就行了
参考代码:
class _stack
{
public:
int getm();
void push(int d);
void pop();
private:
stack<int> mstack;
stack<int> dstack;
};
int _stack::getm()
{
if(mstack.empty()) return -1;
return mstack.top();
}
void _stack::push(int d)
{
if(mstack.empty())
{
mstack.push(d);
}
else
{
if(d <= mstack.top())
{
mstack.push(d);
}
}
dstack.push(d);
}