c++ 为什么我无法将元素添加到此堆栈?[duplicate]

t5fffqht  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(116)
    • 此问题在此处已有答案**:

Segmentation fault while accessing vector elements(2个答案)
Why is the phrase: "undefined behavior means the compiler can do anything it wants" true?(2个答案)
3天前关闭。
下面的代码给了我一个运行时错误,我不知道是什么原因,我们正在迭代字符串a,每当我们遇到char = (,我们就把1压入堆栈,每当我们遇到),我们就从堆栈中移除一个元素。

#include <bits/stdc++.h>
using namespace std;
int main() {
    string a= ")()())";
    stack<int> st;

    for(int z = 0; z < a.length(); z++){
        if(a[z] == '(') st.push(1);
        else st.pop();   
                                                              
        }
    
}

有人能解释一下为什么它给我一个运行时错误吗?

0md85ypi

0md85ypi1#

在第一次迭代(z ==0)时,您将遇到一个')'字符。
因为它是!= '(',所以你会尝试使用popstack,因为它仍然是空的。
这就是导致运行时错误的原因。
旁注:

  1. Why should I not #include <bits/stdc++.h>?
  2. Why is "using namespace std;" considered bad practice?
gstyhher

gstyhher2#

即使堆栈为空,也会从堆栈中弹出。
你的代码应该是这样的。

#include <bits/stdc++.h>
using namespace std;
int main() {
    string a= ")()())";
    stack<int> st;

    for(int z = 0; z < a.length(); z++){
        if(a[z] == '('){ 
            st.push(1);
        }
        else if(!st.empty()){
            st.pop();
        }
        else{ 
            cout<<"The Stack is empty. Nothing can be poped out"<<endl;
            break;
        }
                                                              
    }
    
}
xoshrz7s

xoshrz7s3#

弹出之前你需要检查栈的大小。让我们看看你的输入-

string a= ")()())";

z在第一次迭代a[z] = ')'中为0时,它将执行下面代码的else条件-

#include <bits/stdc++.h>
using namespace std;
int main() {
    string a= ")()())";
    stack<int> st;

    for(int z = 0; z < a.length(); z++){
        if(a[z] == '(') st.push(1);
        else st.pop(); // The root cause of the issue is here
                                                              
        }
    
}

这意味着它将尝试弹出栈顶元素,但由于您尚未将任何内容压入栈顶,因此栈顶为空。从空栈弹出是未定义的行为。您可以在弹出栈顶之前检查栈顶的大小来修复此错误,如下所示-

#include <bits/stdc++.h>
using namespace std;
int main() {
    string a= ")()())";
    stack<int> st;

    for(int z = 0; z < a.length(); z++){
        if(a[z] == '(') st.push(1);
        else if (!st.empty()) st.pop();   
                                                              
        }
}

我不确定您的程序打算做什么,但这肯定会修复未定义的行为。

相关问题