題目:最小棧
解題思路
設進行操作的棧爲s1,如果沒有取得棧中最小值的操作,可以很輕鬆解決問題,問題的難點就在於如何在常數時間裏找到棧中的最小值,爲了實現這一目標我們再開一個棧s2,將棧s2維護爲一個單調遞減的棧,棧頂元素最小。
- 入棧操作:直接將x壓入s1,當x小於等於棧s2的棧頂元素時,將x也壓入s2中,這是因爲這時棧中的最小元素變爲x了,當x大於棧s2的棧頂元素時,不用將x壓入棧s2,因爲現在棧s1中的最小元素依然是原s2的棧頂元素
- 出棧操作:s1直接進行出棧操作,設出棧元素爲top,當top等於s2的棧頂元素時,s2進行出棧操作,這時因爲s1中的最小值已經出棧了,所以s2也要進行出棧,當top大於s2的棧頂元素時,不用出棧,因爲s1中的最小元素還沒有出棧,此時s1中的最小元素依然是s2的棧頂元素
C++代碼
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
s1.push(x);//s1直接壓棧
if(s2.empty() || x <= s2.top()) s2.push(x);//s2爲空,或者x小於等於棧頂元素時壓棧
}
void pop() {
if(s1.empty()) return;
if(s2.top() == s1.top()) s2.pop();//如果出棧元素是最小值時,s2也出棧
s1.pop();//s1直接出棧
}
int top() {
if(s1.empty()) return 0;
return s1.top();
}
int getMin() {
if(s2.empty()) return 0;
return s2.top();//s2的棧頂元素即爲棧s1中的最小值
}
private:
stack<int>s1;//操作的棧
stack<int>s2;//單調遞減棧,棧頂元素最小,用於在常數時間裏找到最小值
};
/**
* 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();
*/