Leetcode155 最小栈

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

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

链接:https://leetcode-cn.com/problems/min-stack

思路:1.整两个栈,一个是原始的堆栈,另外一个记录堆栈的最小的状态。

2.在push的时候,原始堆栈正常操作,最小堆栈要判断是不是比堆栈中顶部的数字相等或者要小。如果符合条件,则入栈,否则不入栈。

3.再pop的时候,判断原始栈出来的值是不是和最小栈一样,如果一样,一起pop,不一样,只pop原始的堆栈

代码:

class MinStack {
    public static final int   INT_MAX= 0x7fffffff;
    Stack<Integer> S;
     Stack<Integer> S_min;

    
    /** initialize your data structure here. */
    public MinStack() {
       S=new Stack<>();
        S_min=new Stack<>();
    }
    
    public void push(int x) {
        S.push(x);
        if(S_min.isEmpty())
        {
            S_min.push(x);
        }
        else if((!S_min.isEmpty())&&x<=S_min.peek())
        {
            S_min.push(x);
        }
        // System.out.println("after push");
        // System.out.println("S_min size="+S_min.size());
        // System.out.println("S size="+S.size());

    }
    
    public void pop() {
        int a=S.peek();
        int b=S_min.peek();
        if(a==b)
        {
            S.pop();
            S_min.pop();
        }
        else
        {
             S.pop();
        }

        // System.out.println("after pop");
        // System.out.println("S_min size="+S_min.size());
        // System.out.println("S size="+S.size());


    }
    
    public int top() {
        return S.peek();
    }
    
    public int getMin() {
        return S_min.peek();
    }
}

/**
 * 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();
 */
原文地址:https://www.cnblogs.com/William-xh/p/13778547.html