2015-03-30 6 views
6

Ich habe einen Ausdruck wie unten. MIN (MAX (AVG (4,2), 2,3), SUM (1,2))) Ich habe einen Rangierbahnhof-Algorithmus implementiert, um Infix in umgekehrte polnische Notation umzuwandeln. Ich füge die Funktion MAX, MIN und AVG mit zwei Argumenten hinzu. Aber angenommen, wenn ich Variablenargumente implementieren möchte, dann muss ich wissen, wie viele Argumente jede Funktion im Infix-Ausdruck hatte. Kann mir jemand sagen, wie ich den Rangierbahnhof-Algorithmus ändern könnte, um Nein zu enthalten? der Argumente jeder Funktion beim Konvertieren von Infix zu RPN?Wie zählt man die Anzahl der Argumente einer Methode während der Umwandlung von Infix-Ausdruck in umgekehrte polnische Notation

Antwort

2

So habe ich es endlich getan. Wenn das Token eine offene Klammer ist, füge ich es der Ausgabewarteschlange hinzu. Wenn ich dann die RPN-Ausgabe konvertiere oder ausführe und auf ein Funktionsaufruf-Token stoße, platziere ich Elemente vom Stapel, bis ich auf eine offene Klammer stoße, verwerfe sie und betrachte alles dazwischen als ein Argument für die Funktion.

Wahrscheinlich nicht eine saubere Lösung, sondern arbeitete wie ein Charme :)

5

Also, wenn Sie log max(1, 2, 3, 4, 5) haben Sie tun:

log => push sin to stack 
max => push max to stack 
(=> push (to stack 
1 => push 1 to stack 
, => pop top of stack to output => pop 1 to output 
2 => push 2 to stack 
, => pop 2 to output 
... 
=> end result: 1 2 3 4 5 max log 

Das Problem ist, dass Sie nicht wissen, wie viele Argumente gehören zu max und wie viele zu log (der Logarithmus nicht nehmen oder kann die Base kann als Argument auch).

die wikipedia description benutzen, sollte es möglich sein, jedes Funktionsargument Trennzeichen (Komma) zu zählen: Wenn Sie k Funktion Separatoren haben, dann haben Sie k + 1 Argumente, so könnten Sie geben ein 1 2 3 4 5 max_5 log oben. Achten Sie darauf, unterschiedliche Zählungen im Fall von verschachtelten Funktionen haben:

max(1, 2, log(3, 4), 5) => 1 2 3 4 log_2 5 max_4 
           --------- 
      max has 4 arguments after evaluating log_2(3, 4) 

Sie einen Zähler für die max Token und eine andere für die log Funktion haben würde. Sie müssen die Zählung für das oberste Funktionstoken in Ihrem Stapel, aber auch für alle anderen Funktionstoken in Ihrem Stapel verfolgen, da Sie diese Zählungen eventuell fortsetzen können.

0

Eine etwas sauberere Lösung ist, einen anderen Stapel zu machen. Drücke die aktuelle Token-Position dieses Stapels, um eine offene Klammer zu finden. Wenn eine geschlossene Klammer gefunden wird, geben Sie den ersten Wert ein und verwenden Sie den Unterschied zwischen der aktuellen Token-Position, um die Gesamtzahl der Argumente zwischen den Klammern zu ermitteln. Wenn der Operator eine Funktion ist, können Sie den Wert verwenden oder anderweitig verwerfen.

Verwandte Themen