啊这个题,怎么说,我一开始的时候想,直接用一个min变量来存储就算了,然后出栈的时候再对比一下,还原为上一个最小值。
但想想不大对劲,天知道我出栈之后,删除的元素是不是最小的?使用一个变量记录不大对劲啊。
然后又想,不如对于每次添加、删除,都保存一个状态,把它们都存储在……想到它的大小是会改变的,所以就存放在ArrayList里面吧?
ummmm接下来就是各种边界问题,什么null、bounds……真是

最后看看别人的解答,才知道,我现在在学习栈,就应该使用栈来解决……
新建一个存储当前元素的最小值的栈,每次添加或删除元素就更新一下状态。
注意当它是空栈时,或者将要变成空栈时的边界操作。

这是一个简单题,但刚刚遇到,觉得非常有意思,赞一个,还是基础太薄弱了。

class MinStack { 
    Stack<Integer> data;
    Stack<Integer> min;
    
    /** initialize your data structure here. */
    public MinStack() {
        data = new Stack<>();
        min = new Stack<>();
    }
    
    public void push(int x) {
        data.push(x);
        // 若它是第一个入栈的元素,则直接加入最小值栈
        // 或者它的值比栈的前一个值还要小,更新
        if(min.isEmpty() || x < min.peek()){
            min.push(x);
        }else{
            // 否则保持原值
            min.push(min.peek());
        }
    }
    
    public void pop() {
        data.pop();
        // 继续弹出
        min.pop();
    }
    
    public int top() {
        return data.peek();
    }
    
    public int getMin() { 
        return min.peek();
    }
}