2014-03-13 72 views
-3

這是我的第一個數據結構程序。我正在實現一個使用數組的push,pop和initialize函數的簡單堆棧。我得到一個無限循環作爲輸出。你能告訴我這是爲什麼嗎?無限循環棧實現C++

#include<iostream> 

using namespace std; 
# define SIZE 6 

class stack{ 



    public: 
     void init(); 
     void push(int i); 
     int pop(); 
     int top; 
     int stck[SIZE];//bydefault private 

}; 

void stack::init() 
{ 
    top=0; 
    return; 
} 

void stack::push(int i) 
{ 

    if(top==SIZE) 
    { 
     cout<<"stack is full"; 
     return; 
    } 
    else 
    { 
     top=top+1; 
     stck[top]= i; 
     return; 
    } 
} 

int stack::pop() 
{ 
    if(top==0) 
    { 
     cout<<"stack is empty. \n"; 
     return 0; 
    } 
    else 
    { 
     top = top-1; 
     return(stck[top-1]); 
    } 
} 

int main() 
{ 
    stack stack1; 
    stack1.init(); 
    int a; 
    int m; 


    while(a!=4) 
    { 

     cout<<"1. push 2. pop 3.display 4.exit .\n"; 
    cin>>a; 



    if(a==1){ 
     cout<< "enter value"; 
     cin>>m; 
     stack1.push(m); 
    } 
    if(a==2) 
    { 
     cout<<"popped"<< stack1.pop(); 

    } 
    if(a==3) 
    { 
     for(int k=0; k<=stack1.top;k++) 
     { 
      cout<<stack1.stck[k]; 

     } 
    } 

    } 

} 
+3

爲什麼你認爲有無限循環? – Maroun

+0

如果您編寫自己的類,則應該使用私有字段和構造函數。 – tgmath

+2

如果你去公衆場合,你就不會穿髒兮兮的襯衫,所以請在公共場合介紹格式良好的代碼。不鼓勵使用宏的常量,而是使用'const'變量。另外,不鼓勵使用'using namespace std;',否則會導致名稱衝突。 – Flovdis

回答

5

你永遠不會初始化a,所以你的程序有未定義的行爲。具體而言,while (a != 4)行執行a的左值到右值轉換,而其值不確定,C++標準在4.1節中明確指出爲未定義行爲。

但是,我懷疑這是造成手頭的問題。在實踐中,除非優化器只是優化了所有代碼,否則程序通常應該按預期運行;只有當你在第一個循環上出現問題時纔會出現a == 4。這不會使代碼可以接受,但可能更多。

我懷疑問題是你用top來表示一個過去的元素數量。當你有零元素時,你指向第一個;當你有一個,你指向第二個,等等。這意味着你指向第一個未使用的元素。

然而,在這兩個你pushpop功能,您可以更改top先,然後才訪問堆棧,但作爲如果你沒有改變:

top = top + 1; 
stck[top] = i; 

當你的籌碼是空的,這將top設置爲1,然後訪問stck[1]。同時,stck[0]未設置。彈出時,您有相反的:

top = top - 1; 
return stck[top-1]; 

這臺top回0,但返回stck[-1],這是出界。

我懷疑如果你將SIZE值推入堆棧,最終會覆蓋不相關的內存,這可能會導致各種麻煩。我仍然看不到無限循環如何遵循,但是由於行爲沒有定義,這當然是一個可能的結果。如果您從未檢查您的輸入是否成功,如果您輸入的內容無效,則所有進一步的讀取都將失敗,並且a將保持不等於4.你可以通過使更改while解決這個問題是

while (a != 4 && std::cin) 

在這種情況下,如果你輸入的東西無效,std::cin進入非正常狀態,你的循環(因此程序)將結束。)

+0

斑點。通常你會使用do {} while()循環來計算輸入後的用戶輸入*; *)。 –

+0

雖然(無雙關語意思)一個有效的陳述,這是如何使無限循環發生?如果沒有(我不知道怎麼可能),這應該是一個評論而不是答案。 – mah

+0

@mah:有效的點,我看到你擊敗了我。 :) –

2

你只有h一個單一的循環,根據用戶輸入終止。

如果cin>>a失敗,a將具有任何開始的值(您的代碼中未定義),並且您將循環該不變的值。

用於輸入呼叫的典型方式失敗包括

  • 按壓控制 + d(* nix的系統上)
  • 按壓控制 + ž(在Windows系統上)
  • 從用盡的管道或文件重定向的輸入

也可能有其他原因導致輸入失敗。