解法一:双栈
一个栈用来存放数据,一个栈用来存放栈中当前的最小值。第一个元素直接入最小栈,当遇到不大于最小栈的栈顶元素时,继续压入最小栈。
注意push函数中用的是<=,因为最小值可能出现多次,如:0,1,0。在0出栈后,栈中最小值仍然是0,所以重复最小都要入最小栈。
class MinStack {
private:
stack<int> min; //最小栈,存放当前栈中的最小值
stack<int> s; //数据栈
public:
/** initialize your data structure here. */
MinStack() { }
void push(int x) { //入栈
s.push(x);
if(min.empty() || x<=min.top()) //注意是<=而不是< !!!
min.push(x);
}
void pop() { //出栈
if(s.top()==min.top())
min.pop();
s.pop();
}
int top() { //取栈顶
return s.top();
}
int getMin() { //获取最小值
return min.top();
}
};
/**
* 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->getMin();
*/