左神书籍-最小栈

54 阅读1分钟

leetcode.cn/problems/mi…


class MinStack {
    // 保存栈元素
    Stack<Integer> dataStack;
    // 保存每一步的最小值
    Stack<Integer> minStack;

    public MinStack() {
        dataStack = new Stack<>();
        minStack = new Stack<>();
    }

    /**
     * 将元素val推入堆栈。
     *
     * @param val
     */
    public void push(int val) {
        dataStack.push(val);
        
        if (minStack.empty()) {
            minStack.push(val);
        } else if (val < getMin()) {
            minStack.push(val);
        } else {
            // 如果最小栈栈顶元素更小或两者相等,重复压入最小栈栈顶元素
            minStack.push(getMin());
        }
    }

    /**
     * 删除堆栈顶部的元素。
     */
    public void pop() {
        if (dataStack.empty()) {
            throw new RuntimeException("stack is empty");
        }
        dataStack.pop();
        minStack.pop();
    }

    /**
     * 获取堆栈顶部的元素。
     *
     * @return 栈顶元素
     */
    public int top() {
        return dataStack.peek();
    }

    /**
     * 获取堆栈中的最小元素。
     *
     * @return min值
     */
    public int getMin() {
        if (minStack.empty()) {
            throw new RuntimeException("stack is empty");
        }
        return minStack.peek();
    }
}