Frage

Ich versuche, eine Liste zu bewerten, die einen Ausdruck in der Präfix-Notation darstellt.Hier ist ein Beispiel einer solchen Liste:

generasacodicetagpre.

Was ist der beste Weg, um den Wert der Liste zu bewerten

War es hilfreich?

Lösung

Es ist einfacher, wenn Sie Postfix anstelle von Präfix verwendet haben. Sehen Sie RECEING Polnische Notation (RPN) . Angesichts eines Ausdrucks in RPN ist es einfach, das mit nur einem Stapel zu bewerten.

Da Sie jedoch nach einem Weg gefragt haben, um Prefix-Ausdrücke ohne Rekursion zu bewerten und Stapel zu verwenden (für einen möglicherweise einfacheren Weg, siehe Bearbeiten: unten), hier ist eine Möglichkeit:

Wir können dies mit zwei Stapeln tun.

Ein Stapel (Anrufe-Evaluation) hält die Betreiber (wie +, Sin usw.) und Operanden (wie 3,4 usw.) und den anderen Stapel (nennen es), hält ein Tupel der Anzahl der übten Operanden + Die Anzahl der Operanden, die ein Bediener erwartet.

In jeder Zeit, wenn Sie einen Bediener sehen, drücken Sie den Bediener auf den Auswertestapel und drücken das entsprechende Tupel auf den Zählstapel.

jederzeit, wenn Sie einen Operanden (wie 3,5 usw.) sehen, überprüfen Sie das obere Tupel des Grafenstapels und verringern die Anzahl der Operanden, die in diesem Tupel zu sehen sind.

Wenn die Anzahl der zu erzusenden Operanden Null wird, werden Sie das Tupel aus dem Count-Stack aufgeben. Dann von dem Evaluierungsstapel, den Sie aus der Anzahl der benötigten Operanden abgeben (Sie wissen dies aufgrund des anderen Werts des Tupels), geben Sie den Bediener aus und tun Sie den Vorgang, um einen neuen Wert (oder Operanden) zu erhalten.

Drücken Sie nun den neuen Operand wieder auf den Evaluierungsstapel. Dieser neue Operanden-Push führt dazu, dass Sie einen anderen Blick auf den Grafenstapel nehmen, und Sie tun dasselbe, was wir gerade getan haben (Dekrementieren Sie die Operanden, die mit Null vergleichen).

Wenn der Operandenzähler nicht Null wird, fahren Sie mit dem nächsten Token in der Eingabe fort.

Beispielsweise sagen Sie, dass Sie + 3 + 4/20 4

auswerten mussten

Die Stapel sehen aus (links ist die Oberseite des Stapels)

generasacodicetagpre.

edit:

Ein Freund schlug einen Weg vor, dies ohne mehrere Stapel zu tun:

Beginnen Sie am Ende, gehen Sie zum ersten Bediener. Die Token rechts davon werden Operanden sein. Bewerten und wiederholen. Scheint viel einfacher zu sein, als es mit zwei Stapeln zu tun. Wir können eine doppelt verknüpfte Liste verwenden, um die Eingabe darzustellen, die wir während der Verarbeitung ändern. Wenn Sie auswerten, löschen Sie Knoten und fügen Sie das Ergebnis ein. Oder Sie könnten vielleicht nur einen Stack verwenden.

Andere Tipps

küssen, in umgekehrter Wert als Postfix-Expression auswerten.

Die Art und Weise, wie ich es sehe, haben Sie zwei Möglichkeiten.Entweder nach links nach rechts oder rechts nach links (als oben vorgeschlagene Paulus).Beide Methoden werden in dem untenstehenden Code demonstriert.

generasacodicetagpre.

Einige Tests:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top