1. 程式人生 > >每天一道LeetCode-----實現一個棧,提供一個介面用於返回棧中最小值

每天一道LeetCode-----實現一個棧,提供一個介面用於返回棧中最小值

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(); */