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:
Während der Stapel nicht leer ist, lies Infix von links nach rechts und mache folgendes:
Wenn das aktuelle Zeichen in Infix ein Operator ist,
Dies ist im Grunde ein Kommentar zu der Antwort von Yuushi.
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). 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%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:
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.
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.
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.
Ich bin nicht davon überzeugt, dass Ihre Operator-Vorrangtabellen korrekt sind, aber ich lasse Sie das überprüfen.
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.
Tags und Links c++ stack postfix-notation infix-notation