栈与队列中等2 种解法

#155最小栈

实现支持 push、pop、top 和 O(1) getMin 的栈。

#设计#

解题主线

01

每个元素同时保存入栈后对应的最小值,弹栈时最小值自然回退。

02

双栈法让最小值栈与数据栈严格同步,每层都保存当前最小值。

解法 1值与当前最小值成对入栈

每个栈帧保存 [value, minSoFar],所有操作只访问栈顶。

时间复杂度

所有操作 O(1)

空间复杂度

O(n)

155. 最小栈 · 值与当前最小值成对入栈
import java.util.ArrayDeque;
import java.util.Deque;

final class MinStack {
    private final Deque<int[]> stack = new ArrayDeque<>();

    public void push(int value) {
        int minimum = stack.isEmpty() ? value : Math.min(value, stack.peek()[1]);
        stack.push(new int[] {value, minimum});
    }

    public void pop() {
        stack.pop();
    }

    public int top() {
        return stack.element()[0];
    }

    public int getMin() {
        return stack.element()[1];
    }
}

每个栈帧保存 [value, minSoFar],所有操作只访问栈顶。

解法 2数据栈 + 最小值栈

每次 push 都在辅助栈压入新的当前最小值,pop 时两栈同步弹出。

时间复杂度

所有操作 O(1)

空间复杂度

O(n)

155. 最小栈 · 数据栈 + 最小值栈
import java.util.ArrayDeque;
import java.util.Deque;

final class MinStack {
    private final Deque<Integer> values = new ArrayDeque<>();
    private final Deque<Integer> minimums = new ArrayDeque<>();

    public void push(int value) {
        values.push(value);
        minimums.push(minimums.isEmpty() ? value : Math.min(value, minimums.peek()));
    }

    public void pop() {
        values.pop();
        minimums.pop();
    }

    public int top() {
        return values.element();
    }

    public int getMin() {
        return minimums.element();
    }
}

每次 push 都在辅助栈压入新的当前最小值,pop 时两栈同步弹出。

  • 补上旧双栈实现遗漏的 minimums.pop()。

边界与易错点

  • 旧双栈版 pop 只弹数据栈而未弹 minStack,导致最小值永久残留。
  • 重复最小值也必须逐层保存或计数,否则弹出一个后会错误丢失最小值。
  • ArrayDeque 不允许 null;题目保证只在非空栈调用查询操作。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

medium/Q155_MinStack.java