www.wikidata.de-de.nina.az
Der Shunting yard Algorithmus deutsch Rangierbahnhof Algorithmus ist eine Methode um mathematische Terme von der Infixnotation in die umgekehrte polnische Notation oder in einen abstrakten Syntaxbaum zu uberfuhren Der Algorithmus wurde von Edsger W Dijkstra erfunden und mit englisch shunting yard Rangierbahnhof benannt weil er in seiner Arbeitsweise an einen Rangierbahnhof erinnert Grafische Illustration des Algorithmus als 3 Weg Weichenstellung Inhaltsverzeichnis 1 Funktionsweise 2 Im Detail 3 Beispiele 3 1 3 4 5 6 3 2 1 2 3 4 5 6 7 8 9 3 3 cos 1 sin ln 5 exp 8 2 4 WeblinksFunktionsweise BearbeitenDer Shunting yard Algorithmus benotigt fur die Konversion sowohl eine Input als auch eine Outputqueue sowie einen Stack der fur das Zwischenspeichern der Operatoren benotigt wird Der Input String wird zeichenweise gelesen wobei alle Zahlen direkt und in derselben Reihenfolge in die Ausgabevariable geschrieben werden Falls das anstehende Zeichen ein Operationszeichen ist wird es auf den Operatorenstack gelegt Falls bereits ein Operator auf dem Stack liegt wird anhand der Operatorrangfolge und der Operatorassoziativitat entschieden ob der neue Operator direkt auf den Stack gelegt wird oder ob der Stack zuerst in den Output geleert wird Offnende Klammern werden ebenfalls auf den Operatorstack gelegt allerdings werden sie beim Entfernen nicht in den Outputstream geschrieben Bei schliessenden Klammern wird der Stack bis zum Antreffen einer offnenden Klammer geleert sollte keine offnende Klammer gefunden werden ist der Inputstring unvollstandig wobei allerdings die Fehlerbehandlung nicht durch den Algorithmus definiert wird Im Detail BearbeitenEs folgt ein deutscher Pseudo Code der in die meisten Programmiersprachen einfach ubersetzt und angepasst werden kann Stack mit LIFO Prinzip und Ausgabe Queue anlegen SOLANGE Tokens verfugbar sind Token einlesen WENN Token IST Zahl Token ZU Ausgabe ENDEWENN WENN Token IST Funktion Token ZU Stack ENDEWENN WENN Token IST Argumenttrennzeichen BIS Stack Spitze IST offnende Klammer Stack Spitze ZU Ausgabe FEHLER BEI Stack IST LEER GRUND 1 Ein falsch platziertes Argumenttrennzeichen GRUND 2 Der schliessenden Klammer geht keine offnende voraus ENDEFEHLER ENDEBIS ENDEWENN WENN Token IST Operator SOLANGE Stack IST NICHT LEER UND Stack Spitze IST Operator UND Token IST linksassoziativ UND Prazedenz von Token IST KLEINER GLEICH Prazedenz von Stack Spitze Stack Spitze ZU Ausgabe ENDESOLANGE Token ZU Stack ENDEWENN WENN Token IST offnende Klammer Token ZU Stack ENDEWENN WENN Token IST schliessende Klammer BIS Stack Spitze IST offnende Klammer FEHLER BEI Stack IST LEER GRUND 1 Der schliessenden Klammer geht keine offnende voraus ENDEFEHLER Stack Spitze ZU Ausgabe ENDEBIS Stack Spitze offnende Klammer entfernen WENN Stack Spitze IST Funktion Stack Spitze ZU Ausgabe ENDEWENN ENDEWENN ENDESOLANGE BIS Stack IST LEER FEHLER BEI Stack Spitze IST offnende Klammer GRUND 1 Es gibt mehr offnende als schliessende Klammern ENDEFEHLER Stack Spitze ZU Ausgabe ENDEBIS Dieser Algorithmus setzt voraus dass alle Tokens richtig erkannt werden und gultig sind Insbesondere die Uberlagerung der Zeichen und ubernimmt dieser Algorithmus nicht Ein Konflikt von rechts und linksassoziativen Operatoren mit gleicher Prazedenz wird nicht abgefangen Der lesende Zugriff auf den Stack z B bei Stack Spitze IST und der nehmende bei Stack Spitze ZU werden vorausgesetzt Vorausgesetzte Funktionen sind Erkennen von Zahlen Erkennen von Funktionen Erkennen von Argumenttrennzeichen Erkennen von Operatoren Feststellen der Operatorassoziativitat Feststellen der Operatorprazedenz hier bedeutet hohere Prazedenz eine starkere Bindung die Prazedenz einer Funktion ist maximal Beispiele BearbeitenDie folgenden in Infix Notation gegebenen Rechnungen sollen umgeformt werden Es wird dokumentiert was geschieht Prazedenzen lt lt lt Funktionen 3 4 5 6 Bearbeiten Tokens zusammenfassen 3 4 5 6 Hier Jedes Zeichen ist ein Token auf den Stack 3 zur Ausgabe auf den Stack 4 zur Ausgabe zur Ausgabe vom Stack entfernen Operator erwartet aber gefunden implizites auf den Stack auf den Stack 5 zur Ausgabe auf den Stack 6 zur Ausgabe zur Ausgabe vom Stack entfernen Ende zur AusgabeAusgabe 34 56 1 2 3 4 5 6 7 8 9 Bearbeiten Tokens zusammenfassen 1 2 3 4 5 6 7 8 9 Hier Jedes Zeichen ist ein Token 1 zur Ausgabe auf den Stack 2 zur Ausgabe zur Ausgabe auf den Stack 3 zur Ausgabe auf den Stack 4 zur Ausgabe zur Ausgabe zur Ausgabe auf den Stack 5 zur Ausgabe auf den Stack 6 zur Ausgabe auf den Stack ist rechtsassoziativ 7 zur Ausgabe zur Ausgabe zur Ausgabe auf den Stack 8 zur Ausgabe zur Ausgabe zur Ausgabe auf Stack 9 zur Ausgabe Ende zur AusgabeAusgabe 12 34 567 8 9 Explizit geklammert 1 2 3 4 5 6 7 8 9 ist dies moglicherweise einfacher nachzuvollziehen cos 1 sin ln 5 exp 8 2 Bearbeiten Tokens zusammenfassen cos 1 sin ln 5 exp 8 2 cos auf den Stack auf den Stack 1 zur Ausgabe auf den Stack sin auf den Stack auf den Stack ln auf den Stack auf den Stack 5 zur Ausgabe oberste vom Stack entfernen ln zur Ausgabe auf den Stack exp auf den Stack auf den Stack 8 zur Ausgabe oberste vom Stack entfernen exp zur Ausgabe zur Ausgabe oberste vom Stack entfernen sin zur Ausgabe auf den Stack 2 zur Ausgabe zur Ausgabe zur Ausgabe oberste vom Stack entfernen cos zur Ausgabe Ende Keine ubrigen Elemente im Stack also Fertig Ausgabe 15ln8exp sin2 cosWeblinks BearbeitenUrsprungliche Beschreibung des Algorithmus PDF 1 1 MB englisch Abgerufen von https de wikipedia org w index php title Shunting yard Algorithmus amp oldid 209385763