题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例

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

解题思路

思路参照 LeetCode 题解区大佬 krahets的题解
创建两个栈,栈 A 用于正常压栈和弹栈。栈 B 用于记录当前最小的数,若当前压进栈 A 的值小于等于栈 B 的顶部,那么将这个数同时也压进栈 B。
图片说明

Java代码实现

class MinStack {

    /** initialize your data structure here. */
    private Stack<Integer> stackA;
    private Stack<Integer> stackB;
    public MinStack() {
        stackA = new Stack<Integer>();
        stackB = new Stack<Integer>();
    }

    public void push(int x) {
        stackA.push(x);
        if (stackB.empty() || stackB.peek() >= x) {
            stackB.push(x);
        }
    }

    public void pop() {
        int val = stackA.pop();
        if (val == stackB.peek()) stackB.pop();
    }

    public int top() {
        return stackA.peek();
    }

    public int min() {
        return stackB.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.min();
 */