为什么我不能添加元素到这个堆栈?



由于某种原因,下面的代码给了我一个运行时错误,我无法弄清楚。我们在字符串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();   

}

}

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

在第一次迭代(z==0)时,您将遇到一个')'字符。
因为它是!= '(',你将尝试pop一个stack,仍然是空的。
这是导致运行时错误的原因。

指出:

  1. 为什么我不应该#include ?
  2. 为什么使用命名空间std;"被认为是不好的做法?

即使堆栈为空,也会弹出堆栈。

你的代码应该是这样的:

#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;
}

}

}

您需要在弹出之前检查堆栈大小。让我们浏览一下您的输入-

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();   

}
}

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

最新更新