簡體   English   中英

為什么我無法向該堆棧添加元素?

[英]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
這是您運行時錯誤的原因。

旁注:

  1. 最好避免#include <bits/stdc++.h> - 請參閱此處: Why should I not #include <bits/stdc++.h>? .
  2. 最好避免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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM