2016-11-26 121 views
-1

我想通過使用堆棧來檢查括號是否平衡,例如,如果我爲每個打開的括號輸入(()),那麼存在一個封閉的平衡點; 但每次cout都不平衡。 我無法找到我的代碼有什麼問題。平衡括號

#include <iostream> 
using namespace std; 


struct node 
{ 
    char data ; 
    node* link; 

}; 

bool pop(node*&top,char val) 
{ 
    if(top==NULL) 
     return false; 
    else 
     val=top->data; 
    node* temp=top; 
    top=top->link; 
    delete temp; 
    return true; 


} 
bool push (node*&top,char val) 
{ 
    node* nptr=new node; 
    if(nptr==NULL) 
     return false; 
    nptr->data=val; 
    nptr->link=top; 
    top=nptr; 
    return true; 


} 
bool balancedbracket(char *s,int size1) 

{ 

node* k; 
if (s[0]==')') 
{ 
    return false; 
} 

for(int i=0;i<size1;i++) 
{ 
    if(s[i]=='(') 
    { 
    push(k,'('); 
    } 
    else if (s[i]==')') 
     { 
      pop(k,'('); 
      } 

} 

     if (k==NULL) 
     { 
      return true; 
     } 
     else{ 
      return false; 
     } 




    } 


int main() 
{ 
    char *a=new char; 
    int sizeofmyarray; 
    cout<<"enter size:"; 
    cin>>sizeofmyarray; 
    cout<<"enter array:"; 
    for(int i=0;i<sizeofmyarray;i++) 
    { 
     cin>>a[i]; 
    } 

    if(balancedbracket(a,sizeofmyarray)) 
     cout<<"is balanced"; 
    else 
     cout<<"not balanced"; 


    system("pause"); 
} 
+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

你的'''''''在每個'{'有一個關閉'}'方面是平衡的。但是,這並不意味着您的_encapsulation_是正確的(在語法和/或邏輯上)。使用** indentation **可以使代碼更加清晰,特別是當您擁有**塊**的層次結構時(如您的情況),這是很自定義的。 – FDavidov

+0

IHe正在談論的是程序的任務,而不是代碼中的括號XD – Swift

回答

0

你只分配一個在main()人物:

char *a=new char; 

後來你與

cin>>a[i]; 

每個破壞你堆我> 0

您應該分配一些最大數量的字符:

int main() 
{ 
    char a[1000]; 
    int sizeofmyarray; 
    cout<<"enter size:"; 
    cin>>sizeofmyarray; 
    if (sizeofmyarray > 1000) { 
     cout<<"too big"; 
     return -1; 
    } 
    cout<<"enter array:"; 
    for(int i=0;i<sizeofmyarray;i++) 
    { 
     cin>>a[i]; 
    } 

    if(balancedbracket(a,sizeofmyarray)) 
     cout<<"is balanced"; 
    else 
     cout<<"not balanced"; 

} 
+0

我可以建議建議'std :: vector'而不是固定大小的數組嗎? – user4581301

+0

@ user4581301,是的,std :: vector會走,但OP有很多東西需要學習,我認爲這會更好的指出原來的bug。 –

+0

是的,這是該代碼中的錯誤之一,並檢查指針的值是否失敗。實際上,在調試構建所有的工作,但實際的算法錯誤是,他沒有在開始時將k設置爲NULL – Swift

0

這很簡單的錯誤,你實際上並沒有在開始時將節點指針k設置爲零(NULL),所以你將以非零指針結束,並將其視爲狀態標誌「不平衡」。
delete不會將指針設置爲NULL。 刪除和刪除[]不要將其參數設置爲零。這是因爲參數可能是指針算術的結果,例如引用數組時。

您沒有足夠的內存來存儲陣列:

int main() 
{ 

    int sizeofmyarray; 
    cout<<"enter size:"; 
    cin>>sizeofmyarray; 
    char *a=new char[sizeofmyarray]; 

更好地使用字符串或向量..類似的東西

#include <iostream> 
#include <string> 
using std::cin; 
using std::cout; 
using std::string; 

struct node 
{ 
    char data ; 
    node* link; 
}; 

bool pop(node* &top, char val) 
{ 
    if(top==NULL) 
     return false; 
    else 
     val=top->data; 
    node* temp=top; 
    top=top->link; 
    delete temp; 
    return true; 
} 

bool push (node* &top, char val) 
{ 
    node* newtop; 
    try { 
     newtop = new node; 
    } 
    catch(std::bad_alloc&) 
    { 
     return false; 
    } 
    newtop->data=val; 
    newtop->link=top; 
    top=newtop; 
    return true; 
} 

bool balancedbracket(string s) 
{ 
    node* k = NULL; //!!! never leave it uninitialized 
    if (s[0]==')') 
     return false; 

    for(int i=0;i<s.length();i++) 
    { 
     if(s[i]=='(') 
     { 
      push(k,'('); 
     } 
     else if (s[i]==')') 
     { 
      pop(k,'('); // do we really need this argument? 
     } 

    } 

    return k==NULL; 
} 

int main() 
{ 
    string str; 
    cout << "enter array:"; 
    std::getline(cin,str); 

    if(balancedbracket(str)) 
     cout<<"is balanced\n"; 
    else 
     cout<<"not balanced\n"; 

    system("pause"); 
} 

還有一些其他陷阱我解決有和代碼ISN還沒有最好的實施,但有一些有用的。例如它不推薦把整個命名空間

唯一真正的算法的錯誤是在這裏:node* k;balancedbracket()node* k = NULL;原計劃將工作,但它會破壞它的內存,但直到它到達redzone後面的終點,沒有段錯誤\異常-5將被提出。

enter size:6 
enter array:(.)(.) 
is balancedДля продолжения нажмите любую клавишу . . . 

enter size:6 
enter array:(())((
not balancedДля продолжения нажмите любую клавишу . . .