* AlgoDat SS00 Aufgabe 47 b) * Auswertung arithmetischer Ausdruecke mit zwei Stacks * * Christian Semrau, 29.04.2000 * Christian.Semrau@student.uni-magdeburg.de Algorithmus "ohneklammern": solange eingabe nicht leer{ naechstes token holen und aus der eingabe entfernen wenn token ist operator{ wenn voriges token war op und token ist minus{ 0 auf werteStack pushen token auf opStack pushen token war op }sonst wenn opStack leer{ token auf opStack pushen token war op }sonst wenn prioritaet vom token kleiner/gleich dem obersten stackoperator{ auswerten token wieder an den anfang der eingabe einfuegen token war KEIN op }sonst{ token auf opStack pushen token war op } }sonst{ // kein operator token auf werteStack pushen token war kein op } } // eingabe fertig solange opStack nicht leer{ auswerten } // berechnung fertig ergebnis liegt im werteStack Algorithmus "auswerten": die beiden obersten werte vom werteStack und den obersten operator vom opStack holen die verknuepfung berechnen und auf werteStack pushen Algorithmus "mitklammern": solange eingabe nicht leer{ naechstes token holen und aus der eingabe entfernen /* beginn der aenderung */ wenn token ist oeffnende klammer{ klammer auf opStack pushen token war op }sonst wenn token ist schliessende klammer{ solange oberster operator auf opStack nicht oeffnende klammer ist: auswerten oeffnende klammer vom opStack poppen token war kein op }sonst /* ende der aenderung */ wenn token ist operator{ wenn voriges token war operator und token ist minus{ 0 auf werteStack pushen token auf opStack pushen token war op }sonst wenn opStack leer{ token auf opStack pushen token war op }sonst wenn prioritaet vom token kleiner/gleich dem obersten stackoperator{ auswerten token wieder an den anfang der eingabe einfuegen token war KEIN op }sonst{ token auf opStack pushen token war op } }sonst{ // kein operator token auf werteStack pushen token war kein op } } // eingabe fertig solange opStack nicht leer{ auswerten } // berechnung fertig ergebnis liegt im werteStack