Home > Informatik > Formale Sprachen > Folge 21: Eine Stackmaschine

21.4 Einfache Berechnungen

21.1 - 21.2 - 21.3 - 21.4

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:

  1. Berechne den ersten arithmetischen Ausdruck in der ersten Klammer.
  2. Berechne den ersten arithmetischen Ausdruck in der zweiten Klammer.
  3. Dividiere das erste Ergebnis durch das zweite Ergebnis.
Berechnung durch eine Stackmaschine
Abarbeiten des arithmetischen Ausdrucks durch die Stackmaschine

Diese Abbildung zeigt, wie eine Stackmaschine den Klammerausdruck (4 + 3) / (5 - 2) berechnet.

  1. Der Stack ist leer.
  2. Die Zahl 4, die links in der ersten Klammer steht, wird auf den Stack gepusht.
  3. Nun wird die Zahl 3 gepusht.
  4. Der ADD-Befehl wird ausgeführt.
  5. Die Zahl 5, die links in der zweiten Klammer steht, wird gepusht.
  6. Anschließend wird die Zahl 2 gepusht.
  7. Der SUB-Befehl wird ausgeführt. Im Stack stehen jetzt die Ergebnisse der beiden Klammerausdrücke übereinander.
  8. 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
  1. Erstellen Sie für den arithmetischen Ausdruck (4 + 6) / (8 - 3 ) + 2 den Stackcode.
  2. 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.