每天一道LeetCode-----實現一個棧,提供一個介面用於返回棧中最小值
阿新 • • 發佈:2019-02-14
Min Stack
實現一個棧,除了基本功能外需要提供一個介面用於返回棧中元素的最小值
基本功能使用std::stack就夠了,如果每次需要最小值時都遍歷棧中元素的話會很麻煩,因為棧不支援遍歷(本質上是沒有提供迭代器),所以只能在push的時候記錄最小值
思路是這樣的,使用另一個std::stack記錄最小值。簡稱最小棧
push時記錄最小值的方法是
- 如果要新增的值小於最小棧棧頂,則將其push到最小棧中
- 如果要新增的值大於最小棧棧頂,則將棧頂元素再push一遍到最小棧中
pop函式的做法是
- 彈出數值棧棧頂
- 彈出最小棧棧頂
這種做法和單調佇列類似,假設當前最小棧棧頂為a,要push的元素是b
如果a > b,則將b新增到最小棧中,最小值為b,很正常
如果a < b,則再push一個a到最小棧中,最小值仍為a,滿足要求。這麼做的原因是在b存在期間,最小值肯定是a,所以最小棧中不需要存b。而b銷燬時,從最小棧中彈出多push的a,恢復到新增b之前的狀態。
程式碼如下
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
stack_.push(x);
if (min_.empty() || min_.top() > x)
min_.push(x);
else
min_.push(min_.top());
}
void pop() {
stack_.pop();
min_.pop();
}
int top() {
return stack_.top();
}
int getMin() {
return min_.top();
}
private:
std ::stack<int> stack_;
std::stack<int> min_;
};
/**
* 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();
*/