You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinStack实现中调用getMin()出现空栈错误的原因排查求助

MinStack实现中调用getMin()出现空栈错误的原因排查求助

我来帮你分析问题根源,你的MinStack实现有个关键逻辑漏洞,会导致特定场景下调用getMin()时min栈提前为空:

问题核心

你的push方法仅当新元素严格小于当前min栈顶值时,才往min栈中push新值,但如果新元素等于当前最小值,你并没有同步将其push到min栈。这会在存在多个相同最小值的场景下,触发min栈提前空掉的异常。

举个能复现问题的具体流程:

  1. 执行 push(1) → 主栈[1],min栈[1]
  2. 执行 push(2) → 主栈[1,2],min栈保持[1](2不小于1,不push)
  3. 执行 push(1) → 主栈[1,2,1],min栈还是[1](1不小于1,不push)
  4. 执行 pop() → 主栈弹出1,此时val=1等于min栈顶的1,所以min栈也弹出1 → 主栈剩余[1,2],但min栈已经空了
  5. 此时调用getMin() → 直接访问空栈的peek(),触发空栈异常

修复方案

有两种常见的修复思路,都能解决这个问题:

方案1:每次push同步当前最小值到min栈(推荐,逻辑更直观)

修改push方法,不管新元素大小,都把当前的最小值(新元素和min栈顶的较小值)push到min栈,让主栈和min栈的元素数量始终一致:

public void push(int val) {
    stack.push(val);
    int currentMin;
    if (Minstack.isEmpty()) {
        currentMin = val;
    } else {
        currentMin = Math.min(Minstack.peek(), val);
    }
    Minstack.push(currentMin);
}

方案2:保留"只存最小值"逻辑,但处理相等场景

修改push方法的判断条件,当新元素小于等于当前min栈顶时就push,这样多个相同最小值会被多次存入min栈,避免提前空栈:

public void push(int val) {
    stack.push(val);
    // 当min栈为空,或者当前值小于等于栈顶最小值时,同步push到min栈
    if (Minstack.isEmpty() || val <= Minstack.peek()) {
        Minstack.push(val);
    }
}

对应你的测试用例

虽然看不到测试用例的具体执行步骤,但大概率是遇到了多次push相同最小值后再pop的场景,触发了min栈提前为空的问题。用上面任意一种方案修复后,就能避免这个空栈异常了。

备注:内容来源于stack exchange,提问作者Hritik Rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:49:29