while(!st.empty() && nums[i%n] >= st.top()) st.pop();
此代码可以工作,但while(nums[i%n] >= st.top() && !st.empty()) st.pop();
这不是!
我当时正在解leetcode 503(下一个更大的元素II),我的答案是
int n = nums.size();
stack<int> st;
vector<int> nge(n, -1);
for(int i = 2*n-1; i >= 0; i--) {
while(nums[i%n] >= st.top() && !st.empty()) st.pop();
if(i < n && !st.empty()) nge[i%n] = st.top();
st.push(nums[i%n]);
}
return nge;`
但它不起作用除非我把!st.empty()
放在nums[i%n] >= st.top()
之前
1条答案
按热度按时间4xrmg8kj1#
在第一个版本中,首先检查堆栈是否为空,然后才检查
nums[i%n] >= st.top()
是否为空,这一点很重要,因为如果堆栈为空,st.top()
将抛出错误,程序将崩溃。在第二个版本中,首先检查
nums[i%n] >= st.top()
是否为空,然后才检查堆栈是否为空,在这种情况下,如果堆栈为空,st.top()
将抛出一个错误,程序甚至在到达第二个条件(!st.empty())
之前就会崩溃。因此,只有在
nums[i%n] >= st.top()
之前放置!st.empty()
时才有效在检查堆栈的顶部元素之前,必须确保堆栈不为空。
更多信息:Short Circuit Evaluation