[英]Why am I getting Stack Overflow error in Recursive C program while computing elements of pascal triangle?
[英]Why am I unable to add elements to this stack?
由於某種我無法弄清楚的原因,以下代碼給了我一個運行時錯誤。 我們正在遍歷字符串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 <bits/stdc++.h>
- 請參閱此處: Why should I not #include <bits/stdc++.h>? .using namespace 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在第一次迭代中為 0 時, a[z] = ')'
,因此它將 go 以下代碼的 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();
}
}
我不確定您的程序打算做什么,但這肯定會修復未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.