c++ !st.empty()如果保留在&&之后,将引发运行时错误

vqlkdk9b  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(138)

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()之前

4xrmg8kj

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

相关问题