由于某种原因,下面的代码给了我一个运行时错误,我无法弄清楚。我们在字符串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
,仍然是空的。
这是导致运行时错误的原因。
指出:
- 为什么我不应该#include ?
- 为什么使用命名空间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();
}
}
我不知道你的程序打算做什么,但这肯定会修复未定义的行为。