题目描述:
实现一个带有取最小值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; //辅助栈
};