1.题目描述
题目链接
解题思路:
我们可以采用两个栈来解决该问题,一个是保存数据的栈,一个是保存最小元素的栈。
例如:
输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[ [], [-2], [0], [-2], [], [], [], [] ]
输出:
[null,null,null,null,-2,null,0,-2]
元素入栈后栈中的情况如下图所示:
2.测试代码
class MinStack {
private:
stack<int> data_sta;//定义一个数据栈
stack<int> min_sta;//定义一个最小值栈
public:
MinStack() {
}
void push(int val) {
data_sta.push(val);
if(min_sta.empty() || min_sta.top()>=val){//相同的最小值可有多个
min_sta.push(val);
}
}
void pop() {
int x=data_sta.top();
if(x == min_sta.top()){//当数据栈中最小值出栈时,存放最小值的栈也出栈
min_sta.pop();
}
data_sta.pop();
}
int top() {
int x;
x=data_sta.top();
return x;
}
int getMin() {
return min_sta.top();
}
};
3.测试结果
注意:**最小栈中存放的元素不光是全局最小值,而是局部最小值,当然全局最小的值也存放在里面。**当全局最小出栈后,次小值作为最小值。
if(min_sta.empty() || min_sta.top()>=val){
min_sta.push(val);
}
从这里可以看出,当最小值入栈前,次小值,次次小值都入栈了。