Ein Beispiel
Stackmaschinen kann man verwenden, um arithmetische Ausdrücke zu berechnen.
"Ein arithmetischer Ausdruck besteht aus einer Folge von arithmetischen Operanden (Konstanten, Variablen, Feldelementen und Funktionsaufrufen), die durch (arithmetische) Operatoren und Klammern voneinander getrennt (oder miteinander verknüpft) sind."
Quelle: https://www.cfd.tu-berlin.de/Lehre/EDV1/skripte/f95_skript/node25.html
Hier sehen Sie einen solchen arithmetischen Ausdruck:
(4 + 3) / (5 - 2)
Berechnung durch einen Menschen
Ein mathematisch geschulter Mensch weiß sofort, wie man den obigen Klammerausdruck ausrechnen muss:
- Berechne den ersten arithmetischen Ausdruck in der ersten Klammer.
- Berechne den ersten arithmetischen Ausdruck in der zweiten Klammer.
- Dividiere das erste Ergebnis durch das zweite Ergebnis.
Berechnung durch eine Stackmaschine
Diese Abbildung zeigt, wie eine Stackmaschine den Klammerausdruck (4 + 3) / (5 - 2) berechnet.
- Der Stack ist leer.
- Die Zahl 4, die links in der ersten Klammer steht, wird auf den Stack gepusht.
- Nun wird die Zahl 3 gepusht.
- Der ADD-Befehl wird ausgeführt.
- Die Zahl 5, die links in der zweiten Klammer steht, wird gepusht.
- Anschließend wird die Zahl 2 gepusht.
- Der SUB-Befehl wird ausgeführt. Im Stack stehen jetzt die Ergebnisse der beiden Klammerausdrücke übereinander.
- Schließlich wird der DIV-Befehl ausgeführt. Im Stack steht nur noch das Endergebnis der Berechnung.
Steuercode, Stackcode
Wenn wir die Arbeitsweise der Stackmaschine durch einen Steuercode oder Stackcode beschreiben sollten, dann sähe das so aus:
PUSH 4 PUSH 3 ADD PUSH 5 PUSH 2 SUB DIV
In der nächsten Folge werden wir die Stackmaschine dazu bringen, einen solchen Steuercode aus einer Textdatei einzulesen und Zeile für Zeile abzuarbeiten.
Übungen
Übung 21.4-1
- Erstellen Sie für den arithmetischen Ausdruck (4 + 6) / (8 - 3 ) + 2 den Stackcode.
- Erstellen Sie den Stackcode für den Ausdruck 4 + 6 / 8 - 3 + 2.
Übung 21.4-2
Schreiben Sie eine Klasse Test für Ihre Stackmaschine, die Sie bereits programmiert haben. In dieser Klasse können Sie die Methoden der Stackmaschine auf arithmetische Ausdrücke anwenden. Eine solche Testmethode könnte beispielsweise so aussehen wie im folgenden Quelltext-Kasten.
public void test1() { sm = new Stackmachine(); sm.push(7); sm.push(3); sm.add(); sm.push(12); sm.push(3.14); sm.sub(); sm.div(); System.out.println("Ergebnis = " + sm.top()); }
In diesem Beispiel ist sm ein Objekt der Klasse Stackmachine, das als Attribut der Klasse Test angelegt wurde.
Zu dieser Folge können Sie sich auch wieder ein Arbeitsblatt herunterladen, außerdem ein zweites Arbeitsblatt mit zwei zusätzlichen Übungen.
Weiter mit Folge 22, in der wir einen einfachen Codebuffer programmieren.