Leetcode155最小栈

题目:栈中的最小值

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

来源:力扣(LeetCode)
链接:Leetcode155最小栈

解题思路:

使用两个栈来求解。一个是数据栈,另一个是最小值栈。最小值栈栈顶元素就是此刻最小的值

需要考虑添加(push)元素x时候,x和_min.top()相互比较大小,小的成为最小值栈新的栈顶。
需要考虑删除(pop)元素时候,最小值栈栈顶是上一个最小值。

所以,这里的数据栈和最小值栈联动(等长)

构造最小值栈的过程在push()函数中实现,得到最小值是getMin()函数,返回值就是最小值栈的栈顶元素。

代码:

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {

    }
    
    void push(int x) {
         _data.push(x);//进数据栈
        if(_min.empty())//最小值栈为空
             _min.push(x);
        else//最小值栈不空
        { if(x>_min.top())            
            x=_min.top();//更新x,使之最小

        _min.push(x);//最小x的入最小值栈
            
        }          
        
    }
    
    void pop() {
        _data.pop();
        _min.pop();//同时弹出两个栈
    }
    
    int top() {
        return _data.top();
    }
    
    int getMin() {
        return _min.top();//返回最小值栈栈顶y
    }
    private:
        std::stack<int> _data;//数据栈
        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();
 */

希望对你有帮助。

你可能感兴趣的:(算法与数据结构)