分析
第一反应可能是添加一个成员变量存放最小元素的值,每次压入一个新元素进栈时,如果该元素比当前元素小,则更新最小元素。
但是如果当前最小元素被弹出了栈,如何得到下一个最小的元素呢?
因此,我们发现,仅仅添加一个成员变量存放最小元素时不够的;
也就是说当最小元素被弹出栈后,我们希望得到次最小元素。
因此在压入这个最小元素之前,我们要把次小元素保存起来。
那么我们是不是可以把每次的最小元素(也就是之前的最小元素和新压入元素两者间的最小值)都保存在另外一个辅助栈中。
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
s.push(x);//入数据栈
if(m.empty() || x<=m.top()){
m.push(x);//入辅助栈
}
}
void pop() {
if(s.top() == m.top()){
m.pop();//如果数据栈当前栈顶元素就是最小值,辅助栈弹出该元素
}
s.pop();//数据栈也弹出该元素
}
int top() {
return s.top();
}
int min() {
return m.top();
}
private:
stack<int> s,m;//别忘了成员变量
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
[参考文档] 剑指offer第二版