Home » Tutorials » Sonstiges » Funktionsinterpreter

Funktionsinterpreter

Stack und Queue

Zwei Datenstrukturen, die sehr häufig angewendet werden und sich relativ ähnlich sind, sind der Stack und die Queue – auch als Warteschlange bezeichnet. Dabei werden im ersteren die Daten nach dem sogenannte LiFo-Prinzip (Last in – First Out) gespeichert, in zweiterem hingegen nach dem FiFo-Prinzip (First in – first out). Dabei lässt sich die Queue recht gut mit einem Speichersilo vergleichen. Das Getreide, das als erstes von oben in den Speicher gelangt, kommt auch als erstes unten wieder raus. Den Stack kann man sich hingegen eher als Papierstapel vorstellen. Die Blätter, die als letztes oben abgelegt werden, kann man auch als erstes wieder von oben herunternehmen.

Aufgrund der Funktionsweise bietet sich für unseren Zahlenstack, wie wir gleich sehen werden, ein LiFo-Stack an.
Es ist übrigens durchaus möglich, den Stack selbst zu realisieren, aber wir werden uns in diesem Fall auf die bereits vorhandene Klasse TStack der Unit Contnrs stützen. Diese ermöglicht es uns bereits, beliebige Objekte mit dem Befehl push(…) auf den Stack zu schieben und mit dem Befehl pop() wieder herunter zu holen. Da wir allerdings nicht Objekte, sondern vielmehr Zahlen auf den Stack schieben werden, benötigen wir noch eine kleine Hilfsklasse, die lediglich einen Zahlenwert speichert.

TNumber = class(TObject)
  private
    FNum: Extended;
    procedure SetNum(const Value: Extended);
  public
    constructor Create(num: Extended);
  published
    property Num: Extended read FNum write SetNum;
end;