2012-12-07 14 views
5

sind Ich wurde als eine Bonus-Programmieraufgabe gefragt, ob geschweifte Klammern in einer zufälligen Zeichenfolge oder einem Zeichen wie folgt übereinstimmen: {1 + 1} dies würde 1 zurückgeben, während {1 + 1}) würde return 0. Dies ist, was ich bisher habe, aber es scheint nichts zu tun. Jede Hilfe wäre großartig? dankeC++ Überprüfen, ob geschweifte Klammern

//bonus.cpp 
#include <iostream> 
#include <string> 
#include <queue> 
#include <stack> 

using namespace std; 

int checkBraces (string s) 
{ 
    //int myLength = s.length(); 
    std::stack<int> stack; 
    char d; 

    for (int i = 0; i < s.length(); i++) 
    { 
     char c = s[i]; 

     if (c == '(') 
     { 
      stack.push(c); 
     } 
     else if (c == '[') 
     { 
      stack.push(c); 
     } 
     else if (c == '{') 
     { 
      stack.push(c); 
     } 

     else if (c == ')') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '(') 
       { 
        return false; 
       } 
      } 
     } 

     else if (c == ']') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '[') 
       { 
        return false; 
       } 
      } 
     } 
     else if (c == '}') 
     { 
      if (stack.empty()) 
      { 
       return false; 
      } 
      else 
      { 
       d = stack.top(); 
       stack.pop(); 
       if (d != '{') 
       { 
        return false; 
       } 
      } 
     } 
    } 

    if (stack.empty()) return true; 
    else return false; 

} 


int main() 
{ 
    cout << "This program checks brace ([{}]) matching in a string." << endl; 

    checkBraces ("{1+1}"); 

} 
+2

Haben Sie versucht, den Code in Ihrem Debugger durchzugehen, um zu sehen, was gerade passiert? –

+0

* scheint nichts zu tun * - könnte hier mehr Informationen verwenden. –

+0

Sie haben ziemlich viel Redundanz. Vielleicht sollten Sie eine 'bool pop_if_possible (std :: stack , char)' -Methode haben, damit Sie schreiben können: 'if (c ==') '&&! Pop_if_possible (stack,' (')) {return false; } ' – MSalters

Antwort

1

aber es scheint nicht, etwas zu tun

Es ist etwas tut. Es druckt This program checks brace ([{}]) matching in a string..

Sie rufen checkBraces ("{1+1}"), aber Sie tun nichts mit dem zurückgegebenen Wert. Da dieser Anruf weg optimiert werden kann, sind Sie in gewisser Hinsicht richtig, dass Ihr Programm scheinbar nichts zu tun hat.

Also lass es etwas tun. Drucken Sie die Zeichenfolge, die getestet werden soll, und drucken Sie das Ergebnis des Tests. Sobald Sie das getan haben, sollten Sie testen, und wenn Sie damit fertig sind, sollten Sie noch mehr testen. Testen Sie nicht einfach Fälle wie {i+1}. Testen Sie verschachtelte Fälle, die bestanden werden sollten, und testen Sie auch Fälle, die fehlschlagen sollten.

Lernen, wie man testet und lernt, wie man debuggt, sind ebenso wichtige Fähigkeiten (wenn nicht wichtigere Fähigkeiten), wie zu lernen, wie man Code schreibt.

+0

Ich kann nicht glauben, alles was ich tun musste, war cout << checkBraces (Eingabe); Mein Programm funktioniert super, danke. Ich habe mehrere Fälle ausprobiert, in denen ich nur das verwendete, da ich wusste, dass es 1 zurückgeben sollte. –

6

Was macht Sie denken, dass es nichts tut? Es tut. Es wird nach geschweiften Klammern gesucht, aber Sie tun nichts mit der Rückgabe von checkBraces, was wiederum eine bool, nicht eine int zurückgeben sollte.

Hast du vielleicht gemeint etwas wie:

if (checkBraces ("{1+1}")) 
    cout << "matching"; 
else 
    cout << "not matching"; 

Pro-Tipp: lernen, wie einen Debugger zu verwenden. Sie sollten lernen, wie Sie debuggen, bevor Sie anfangen, etwas mehr als eine "Hallo Welt" zu programmieren.

+0

'" {(}) "' wird berücksichtigt: wenn ''}' 'angetroffen wird, wird der Anfang des Stapels' '(''. – MSalters

+0

@MSalters ah, das stimmt, das habe ich verpasst. –

+0

okay okay mit deiner IF-Anweisung, die du mir gegeben hast, scheint mein Programm ziemlich gut zu funktionieren. Ich muss nur in der Lage sein, den Benutzer aufzufordern, einen String einzugeben und 1 oder 0 zurückzugeben. Was ich denke, kann ich erreichen, indem ich diese Methode zu einem booleschen anstelle eines int mache? –

2

Sie sollten mindestens das Ergebnis von checkBraces ausdrucken.

2

Als Ergänzung zu dem, was bereits gesagt wurde, würde ich sagen, dass Sie die Menge an Code reduzieren können. Wie auch immer Sie Zeichen in Ihren Stapel setzen, warum nicht std::stack<char>?

Sie könnten die Klammern in eine andere Zeichenfolge, speichern Sie es automatisch vergleichen der alles, was ich habe nicht geschrieben std::algorithms

const std::string openingBraces("{[("); 
const std::string closingBraces("}])"); 

if (std::find(openingBraces.begin(), openingBraces.end(), currentChar) != openingBraces.end()) 
    yourStack.push(currentChar); 
else if (std::find(closingBraces.begin(), closingBraces.end(), currentChar) != closingBraces.end()) 
{ 
    // check if currentChar is matching the one on top of your stack 
} 

mit, wie es immer besser ist, Antworten selbst zu finden.

Verwandte Themen