栈 | 最小栈

题目:最小栈

题目链接
在这里插入图片描述

解题思路

设进行操作的栈为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();
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章