2014-06-16 35 views
1

我必須做一個代碼,檢查括號是否平衡使用堆棧鏈表。 這裏是我的代碼,我使用了很多來自課堂的教程和功能點演示文稿,還有我的朋友的一點點幫助。 但是,任何人都可以解釋'詮釋流行'和'檢查'部分,一行一行地發生了什麼(作爲評論部分,我不明白)?我在理解這部分C++(實現的stacks和l.lists)時遇到了問題,而且我沒有任何人可以解釋它以及誰有時間。我嘗試了很多東西,但我真的不明白。 P.S.代碼的工作原理,因爲它應該 謝謝你們!C++瞭解問題鏈接列表和堆棧

#include<iostream> 
#include <string> 
using namespace std; 

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

int pop(node *&stack) //node that points to address of a stack? 
{ 
    char result; 
    node *top=new node; //how can i explain this? 
    top=stack; //why are we equalizing top with stack? 
    result=top->data;//i dont understand 
    stack=top->link;//dont understand 
    delete top; 
    return result; 
} 

bool Pairs(char openP,char closedP) 
{ 
if(openP == '(' && closedP == ')') return true; 
else if(openP == '{' && closedP == '}') return true; 
else if(openP == '[' && closedP == ']') return true; 
else return false; 
} 

bool Check(string exp) 
{ 
    int i=0; 
    node *stack=NULL; 
    while(exp[i]) 
    { 
     if(exp[i]=='(' || exp[i]=='[') 
      { 
       node *neww=new stack;//dont understand 
       neww->data=exp[i];//dont understand 
       neww->link=stack; //-II- 
       stack=neww; //-II- 
      } 
     if(exp[i]==')' || exp[i]==']') 
      { 
      if(stack==NULL) 
       return 0; 
      else if (Pairs(pop(stack), exp[i])==0) //what does mean this part in parentheses? 
       return 0;       
      } 
     i++; 
    } 
    if(stack==NULL) 
     return 1; 
    else 
     return 0; 
} 

int main() 
{ 
    string exp; 
    cout<<"Enter parentheses:\n"; 
    cin>>exp; 
    if(Check(exp)!=0) 
     cout<<"P. are balanced"; 
    else 
     cout<<"P. are not balanced"; 
    return 0; 
}  
+0

使用調試器,並執行它一步一步... – jsantander

+2

我建議你閱讀了關於指針和結構/類,那麼你就會明白了很多這是怎麼回事。不要以爲你從別的地方得到代碼,這是正確的。你對這段代碼持懷疑態度。 – Simon

回答

0

我推薦以下方法:

  • 想想你的算法忽略了語言細節。一個堆棧是正確的路要走,但你不需要考慮如何在你想出算法之前實現你的堆棧。

  • 已經決定,你需要一個給定的數據結構,問問自己是否已經發明瞭自己之前的C++(的std ::堆棧)存在。

  • 使用C++習語不使用C語言(即使用迭代器begin()和end()不索引)除了其他任何東西外,這將防止你的exp [i] bug。

  • 不要有一類做多件事情。如果你需要一個堆棧,那麼創建一個堆棧類,而不是讓你的解析類參與堆棧實現。首先,它更容易考慮檢查算法,其次,堆棧類可以在其他地方重用。

在大綱您的解決方案將使用迭代器來檢查字符串的字符,推動和使用 的std ::堆棧<焦炭>彈出打開支架。不需要新的或任何地方的指針。

+0

我GOOGLE了一些,發現了一些解釋 我知道如何只使用例如布爾偶來解決這個任務,布爾CheckIfBalanced,但目前還不清楚對我說:S是有可能解決它以任何其他方式?正如我所說的,我們必須使用節點,鏈表和堆棧:S – user3743047

+0

我不明白您的評論:「我們必須使用節點,鏈表和堆棧...」。您的任務是檢查平衡括號還是使用各種不必要的數據結構? –