題目描述
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。
注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。
思路
鏈接:https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?f=discussion
來源:牛客網
看到這個問題, 我們最開始可能會想, 添加一個成員變量用於保存最小元素, 每次壓棧時如果壓棧元素比當前最小元素更小, 就更新最小元素.
但是這樣會有一個問題, 如果最小元素被彈出了呢, 如何獲得下一個最小元素呢? 分析到這裏可以發現, 僅僅添加一個成員變量存放最小元素是不夠的, 我們需要在最小元素彈出後還能得到次小元素, 次小的彈出後, 還要能得到次次小的.
因此, 用另一個棧來保存這些元素是再合適不過的了. 我們叫它最小元素棧.
每次壓棧操作時, 如果壓棧元素比當前最小元素更小, 就把這個元素壓入最小元素棧, 原本的最小元素就成了次小元素. 同理, 彈棧時, 如果彈出的元素和最小元素棧的棧頂元素相等, 就把最小元素的棧頂彈出.
代碼
class Solution {
public:
stack<int> s1,s2;
void push(int value) {
s2.push(value);
if(s1.empty() || value <= s1.top()){
s1.push(value);
}
}
void pop(){
if(s2.top() == s1.top()){
s1.pop();
}
s2.pop();
}
int top() {
return s2.top();
}
int min() {
return s1.top();
}
};