题目描述:
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
**注意:**如果堆栈中没有数字则不能进行min方法的调用。
例如:如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1
思路:
这题是《剑指offer》中的第21题。我们可能想到的是:每次压入一个新元素的时候,先将栈里所有元素排序,让最小的元素位于栈顶,这样就能在O(1)的时间得到最小的元素了。这样有一个缺点就是,不能保证最后压入的元素最先出栈。《剑指offer》给出的思路是增加一个辅助栈(用于存放数据栈之前最小的元素与新压入栈元素之间的较小值)。
示例演示过程:
步骤 |
操作 |
数据栈 |
辅助栈 |
最小值 |
1 |
压入 3 |
3 |
3 |
3 |
2 |
压入 4 |
3, 4 |
3, 3 |
3 |
3 |
压入 2 |
3, 4, 2 |
3, 3, 2 |
2 |
4 |
压入 1 |
3, 4, 2, 1 |
3, 3, 2, 1 |
1 |
5 |
弹出 |
3, 4, 2 |
3, 3, 2 |
2 |
6 |
弹出 |
3, 4 |
3, 3 |
3 |
7 |
压入 0 |
3, 4, 0 |
3, 3, 0 |
0 |
代码:
#include<iostream>
#include<stack>
#include<assert.h> //注意:如果写成 #include<assert>就会出现无法打开源文件"assert"的错误
using namespace std;
class StackWithMin
{
public:
StackWithMin() { }
~StackWithMin() { }
void push(const int value)
{
dataStack.push(value);
if(minStack.size() == 0 || value <= minStack.top )
minStack.push(value);
else
minStack.push(minStack.top());
}
void pop()
{
assert(dataStack.size() > 0 && minStack.size() > 0);
dataStack.pop();
minStack.pop();
}
const int getMin()
{
assert(dataStack.size() > 0 && minStack.size() > 0);
return minStack.top();
}
private:
stack<int> dataStack; //数据栈
stack<int> minStack; //辅助栈
};