2016-05-30 15 views
-3

Problem:Was stimmt nicht mit dem folgenden Code überein, um ausgeglichene Klammern mithilfe von Stapel zu identifizieren?

Gegeben eine Folge bestehend aus Klammern, bestimmen, ob der Ausdruck ausgeglichen ist. Eine Folge von Klammern ist ausgeglichen, wenn alle offenen Klammern eindeutig mit einem geschlossenen Klammerpaar nach dem ersteren verknüpft werden können. Auch das Intervall zwischen ihnen muss ausgeglichen sein. Sie werden drei Arten von Klammern angegeben werden: ({und [

{[()]} - Dies ist eine ausgewogene Klammer

{[(])} - Dies ist nicht eine ausgewogene Klammer..

Format

Input:...

* die erste Zeile der Eingabe die Anzahl der Testfälle enthält

* Jeder Testfall mit der Sequenz von Klammern aus einer einzigen Linie besteht

stack <char> stk; 
int main() { 
/* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
int n; 

cin>>n; 

for(int i=0;i<n;i++) 
{ 
    string s; 
    cin>>s;cout<<s; 
    int j=0; 
    while(j!=s.length()) 
    { 
     if(stk.size()==0&&(s[j]==')'||s[j]==']'||s[j]=='}')) 
     {stk.push('z');} 
     if(s[j]=='('||s[j]=='['||s[j]=='{') 
      stk.push(s[j]); 
     if(stk.top()=='('&&s[j]==')') 
      stk.pop(); 
     if(stk.top()=='['&&s[j]==']') 
      stk.pop(); 
     if(stk.top()=='{'&&s[j]=='}') 
      stk.pop(); 
     j++; 
    } 
    if(stk.size()==0) 
     cout<<"YES"<<endl; 
    else 
    { 
     cout<<"NO"<<endl; 
     while(stk.size()!=0) 
      stk.pop(); 
    } 
} 
return 0; 
} 

Es ist ein Code zum Überprüfen auf ausgeglichene Klammern. Es funktioniert einwandfrei mit Strings, die mit einem '{' beginnen, aber mit Strings wie "[]" fehlschlagen.

+0

Debugger ....... – kaylum

+0

Anstelle von 'stk.push ('z')' können Sie einfach einen booleschen Wert 'invalid' auf 'true' setzen und einen 'break;' aus der Schleife machen. –

+0

Hier ist ein Hinweis: Versuchen Sie zu tauschen: 'if (stk.top() == '[' && s [j] == ']')' und 'if (stk.top() == '{' && s [j] == '}') 'und sehen, wie sich die Dinge ändern. –

Antwort

1

Sie müssen einen Segmentierungsfehler erhalten.

Angenommen,

s = "[]"; 

Nach ersten Iteration enthält Ihr Stack nur "[".

Während 2. Iteration

if(stk.top()=='['&&s[j]==']') 
     stk.pop(); 

obigen Code macht Ihren Stack leer. In nächste Zeile Sie

rufen
stk.top() // But your stack is empty 

in

if(stk.top()=='{'&&s[j]=='}') 
     stk.pop(); 

Das ist das Problem. Also bevor Sie anrufen

stk.top(); 

stellen Sie sicher, dass Ihr Stapel nicht leer ist.

Überprüfen Sie this Tutorial auf ausgeglichenen Klammern.

+0

Das hat wirklich geholfen. Danke vielmals – Nanda