MinStack实现中调用getMin()出现空栈错误的原因排查求助
MinStack实现中调用getMin()出现空栈错误的原因排查求助
我来帮你分析问题根源,你的MinStack实现有个关键逻辑漏洞,会导致特定场景下调用getMin()时min栈提前为空:
问题核心
你的push方法仅当新元素严格小于当前min栈顶值时,才往min栈中push新值,但如果新元素等于当前最小值,你并没有同步将其push到min栈。这会在存在多个相同最小值的场景下,触发min栈提前空掉的异常。
举个能复现问题的具体流程:
- 执行
push(1)→ 主栈[1],min栈[1] - 执行
push(2)→ 主栈[1,2],min栈保持[1](2不小于1,不push) - 执行
push(1)→ 主栈[1,2,1],min栈还是[1](1不小于1,不push) - 执行
pop()→ 主栈弹出1,此时val=1等于min栈顶的1,所以min栈也弹出1 → 主栈剩余[1,2],但min栈已经空了 - 此时调用
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
相关产品推荐
相关产品推荐

