Konvertieren von einem Infix-Ausdruck in Postfix (C ++) mit Stacks

8

Mein Dozent gab mir die Aufgabe, ein Programm zu erstellen, um den Ausdruck mit Stacks in Postfix zu konvertieren und zu infixieren. Ich habe die Stack-Klassen und einige Funktionen gemacht, um den Infix-Ausdruck zu lesen.

Aber diese eine Funktion namens convertToPostfix(char * const inFix, char * const postFix) , die dafür verantwortlich ist, den inFix-Ausdruck im Array inFix in den post-fix-Ausdruck im Array postFix mit Stacks zu konvertieren, tut nicht, was sie tun soll. Kannst du mir helfen und mir sagen, was ich falsch mache?

Das Folgende ist Code, wo die Funktionen zum Konvertieren von InFix zu PostFix sind und% Co_de% ist, was ich Hilfe beheben muss:

%Vor%

Beachten Sie, dass die Funktion convertToPostfix mit diesem Algorithmus erstellt wurde:

  • Drücken Sie eine linke Klammer '(' auf den Stapel.
  • Fügen Sie am Ende von infix eine rechte Klammer ')' hinzu.
  • Während der Stapel nicht leer ist, lies Infix von links nach rechts und mache folgendes:

    • Wenn das aktuelle Zeichen in Infix eine Ziffer ist, kopiere es auf das nächste Element von postfix.
    • Wenn das aktuelle Zeichen in Infix eine linke Klammer ist, schieben Sie es auf den Stapel.
    • Wenn das aktuelle Zeichen in Infix ein Operator ist,

      • Pop-Operatoren (falls vorhanden) oben im Stapel, während sie den gleichen oder einen höheren Rang als der aktuelle Operator haben, und die Pop-Operatoren in postfix einfügen.
      • Drücke das aktuelle Zeichen im Infix auf den Stapel.
    • Wenn das aktuelle Zeichen in Infix eine rechte Klammer ist
      • Knacken Sie die Operatoren von oben nach unten und fügen Sie sie in Postfix ein, bis sich eine linke Klammer oben im Stapel befindet.
      • Platziere (und verwerfe) die linke Klammer aus dem Stapel.
Reggie Escobar 02.10.2012, 03:18
quelle

5 Antworten

7

Dies ist im Grunde ein Kommentar zu der Antwort von Yuushi.

  • Die äußere while (! stack.empty ()) Schleife ist falsch. entferne es einfach. (behalte den Schleifenkörper vonc). Überprüfen Sie am Ende der Funktion, ob der Stapel leer ist, da der Ausdruck sonst Syntaxfehler aufweist.
  • Wie Yuushi bereits sagte, sieht die Präzedenzfunktion falsch aus. Zuerst sollten Sie den Parametern bessere Namen geben: Einer ist der Operator auf der linken Seite und der andere auf der rechten Seite. (Im Moment nennen Sie es precedence(rightOp, leftOp) ). Dann sollten Sie dokumentieren, was das Ergebnis bedeutet - jetzt geben Sie true zurück, wenn a rOp b lOp c == (a rOp b) lOp c (ja, die Operator-Reihenfolge stimmt nicht mit dem überein, was Sie aufrufen - "+" und "-" sind z. B. nicht in beiden Aufträgen gleich).
  • Wenn Sie einen neuen Operator finden, müssen Sie die alten Operatoren auf dem Stack durchlaufen, zum Beispiel nach dem Lesen von a - b * c ist Ihre Ausgabe a b c und der Stack ist [- *] . Jetzt lesen Sie + , und Sie müssen beide Operatoren aufrufen, was in a b c * - resultiert. Das heißt, die Eingabe a - b * c + d sollte zu a b c * - d + führen.

Aktualisieren : angehängte vollständige Lösung (basierend auf Yuushi's Antwort):

%Vor%     
Stefan 19.01.2013 12:10
quelle
2

Es gibt also eine Reihe von Problemen mit Ihrem Code. Ich werde eine korrigierte Lösung veröffentlichen, die umfangreiche Kommentare enthält, um zu erklären, was passiert und wo Sie Fehler gemacht haben. Ein paar Dinge im Voraus:

  1. Ich verwende std::string anstelle von char * , weil es die Dinge viel sauberer macht, und ehrlich gesagt, sollten Sie es in C++ verwenden, es sei denn, Sie haben einen sehr guten Grund dafür (wie Interoperabilität) mit einer C -Bibliothek). Diese Version gibt auch string zurück, anstatt einen char * als Parameter zu verwenden.

  2. Ich verwende den Stapel aus der Standardbibliothek, <stack> , der sich leicht von deinem selbst erstellten Film unterscheidet. top() zeigt dir das nächste Element ohne entfernt es vom Stapel, und pop() gibt void zurück, aber entfernt das oberste Element vom Stapel.

  3. Es ist eine freie Funktion, nicht Teil einer Klasse, aber das sollte einfach zu ändern sein - es ist einfach einfacher für mich, auf diese Weise zu testen.

  4. Ich bin nicht davon überzeugt, dass Ihre Operator-Vorrangtabellen korrekt sind, aber ich lasse Sie das überprüfen.

%Vor%     
Yuushi 19.01.2013 05:26
quelle
0

Hier ist meine mit C mit mehreren Ziffern Auswertung.

%Vor%     
rajatbarman 06.02.2013 15:47
quelle
0

C ++ - Implementierung:

%Vor%     
rashedcs 21.11.2016 15:10
quelle
-1

Operator Precedence ist das Problem in diesem Fall. Die korrekte Operatorrangfolge in absteigender Reihenfolge lautet:

%Vor%

In der obigen Frage betrachten Sie die Vorrangfunktion

%Vor%

Für jeden Wert in operator1 sollte der entsprechende Wert von operator2 gemäß der oben genannten OPERATOR PRECEDENCE TABLE auf Vorrang überprüft werden. Geben Sie keinen Wert ohne richtigen Vergleich zurück.

    
rohank 25.01.2013 12:39
quelle