- 此问题在此处已有答案**:
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();
}
}
有人能解释一下为什么它给我一个运行时错误吗?
3条答案
按热度按时间0md85ypi1#
在第一次迭代(
z
==0)时,您将遇到一个')'
字符。因为它是
!= '('
,所以你会尝试使用pop
和stack
,因为它仍然是空的。这就是导致运行时错误的原因。
旁注:
gstyhher2#
即使堆栈为空,也会从堆栈中弹出。
你的代码应该是这样的。
xoshrz7s3#
弹出之前你需要检查栈的大小。让我们看看你的输入-
当z在第一次迭代
a[z] = ')'
中为0时,它将执行下面代码的else条件-这意味着它将尝试弹出栈顶元素,但由于您尚未将任何内容压入栈顶,因此栈顶为空。从空栈弹出是未定义的行为。您可以在弹出栈顶之前检查栈顶的大小来修复此错误,如下所示-
我不确定您的程序打算做什么,但这肯定会修复未定义的行为。