LeetCode 503题:栈判空顺序错误导致运行时异常咨询
问题原因:逻辑与的短路求值特性
问题的核心是逻辑与(&&)的短路求值规则,以及C++栈top()方法的调用限制:
- C++中,调用
stack::top()时如果栈为空,属于未定义行为,会直接触发运行时错误(比如程序崩溃)。 - 逻辑与运算符
&&遵循短路求值:只有左边条件为真时,才会判断右边条件;若左边条件为假,右边条件会被直接跳过,不会执行。
两种写法的对比
正确写法
while(!st.empty() && nums[i%n] >= st.top()) st.pop();
这里先判断!st.empty():
- 若栈为空,
!st.empty()为假,整个&&表达式直接为假,右边的nums[i%n] >= st.top()不会执行,避免了空栈调用top()的错误。 - 若栈非空,再判断当前元素是否大于等于栈顶元素,逻辑合法。
错误写法
while(nums[i%n] >= st.top() && !st.empty()) st.pop();
这里先执行nums[i%n] >= st.top():
- 循环刚开始时栈
st是空的,此时调用st.top()会直接触发运行时错误,程序崩溃。右边的!st.empty()根本没有执行机会,无法起到保护作用。
总结
在需要访问栈顶元素的场景下,必须先判断栈是否非空,再调用top()方法,利用逻辑与的短路求值特性,避免空栈访问的非法操作。
内容的提问来源于stack exchange,提问作者Jaydeep Jadhav
相关产品推荐
相关产品推荐

