Shunting-Yard-Algorithmus ist ein Verfahren von Edsger W. Dijkstra (um 1961, im Zusammenhang mit ALGOL-Compilern entwickelt), das mathematische Ausdrücke in Infix-Schreibweise — also der gewohnten Form wie 3 + 4 * 2 — in die Postfix-Schreibweise (auch Reverse Polish Notation, RPN, oder UPN) umwandelt. Der Name erinnert an einen Rangierbahnhof (englisch shunting yard): Operanden und Operatoren werden wie Waggons über Gleise (Stapel) sortiert, bis die richtige Reihenfolge feststeht.

Die zwei Hilfsstrukturen

  • Output-Queue: sammelt das Ergebnis in der richtigen Postfix-Reihenfolge.
  • Operator-Stack: hält Operatoren und Klammern zwischen, bis sie an der Reihe sind.

Das Verfahren läuft in einem einzigen Durchgang von links nach rechts:

Operand          -> direkt in die Output-Queue
Operator O       -> erst alle Operatoren mit
                    höherer/gleicher Präzedenz
                    vom Stack in die Output-Queue,
                    dann O auf den Stack
öffnende Klammer -> auf den Stack
schließende Klammer -> vom Stack bis zur öffnenden
                    Klammer in die Output-Queue
Ende             -> Rest des Stacks leeren

Beispiel: 3 + 4 * 2

Das * hat höhere Präzedenz als +. Deshalb bleibt das + zunächst auf dem Stack, bis das * verarbeitet ist. Das Ergebnis ist 3 4 2 * + — in Postfix. Die Auswertung dieser Form ist trivial: Werte auf einen Stack legen, bei jedem Operator die obersten zwei Werte verknüpfen. Genau das machten klassische RPN-Taschenrechner von Hewlett-Packard.

Präzedenz, Assoziativität und Klammern

Für links-assoziative Operatoren (wie +, -, *, /) werden bei gleicher Präzedenz die bestehenden Operatoren vom Stack geholt. Für rechts-assoziative Operatoren (wie die Potenz ^) bleibt der Operator liegen, bis ein stärkerer kommt. Klammern überschreiben die Präzedenz vollständig: (3 + 4) * 2 ergibt 3 4 + 2 *. Der Algorithmus ist mit O(n) linear in der Eingabelänge — jeder Token wird genau einmal verschoben.

Einsatzgebiete

Der Shunting-Yard-Algorithmus steckt in Formel-Engines, Spreadsheet-Programmen, Interpretern für mathematische Ausdrücke und RPN-Rechnern. Er ist eine Alternative zum Pratt-Parser: Beide lösen das Präzedenz-Problem, der Shunting-Yard erzeugt aber eine flache Postfix-Liste statt eines Strukturbaums. Wer daraus einen Syntaxbaum braucht, kann die Postfix-Form anschließend mit einem Stack in einen Baum überführen.

Verwandte Themen: Parser, Syntax, Queue, rekursiver Abstieg.