#include <stack.h>
Klassendiagramm für Stack< T >:

Öffentliche Methoden | |
| Stack (list< Stack< T > > *listP=NULL) | |
| void | push (const T &x) |
| Push-Funktion mit Ausgabe einer Liste von Stacks. | |
| T | pop () |
| Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks. | |
| T | top () |
| Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist. | |
| T | getTopButOne () const |
| bool | isEmpty () const |
| void | setTopButOne (const T &x) |
| void | setListP (list< Stack< T > > *lP) |
| void | out (string op) |
| Gibt Stack in Debug-Log-Datei aus. | |
Private Attribute | |
| list< Stack< T > > * | mListP |
| Liste von Stacks. | |
| T | mTopButOne |
| das Element, das vor dem letzten gepusht wurde (noetig fuer "y-Register" der Casio Rechner) | |
Die Klasse ist im Prinzip identisch mit der Klasse vector aus der STL. Der Unterschied besteht im wesentlichen darin, dass die Funktionen push() und pop() zu Debug- und Logging-Zwecken eine Ausgabe des aktuellen Stacks in ein Debug-Log-Objekt der Klasse Log bzw. auf die Konsole durchfuehren.
Da im Almetare-Projekt Listen von Stacks verwendet werden und alle Stacks einer Liste ausgegeben werden sollen, enthaelt die Klasse als Member den Zeiger auf die Stack-Liste, zu der der Stack gehoert, und die ganze Liste der Stacks wird bei jedem push() und pop() ausgegeben.
Template-Problematik:
Wie bei Templates ueblich, sorgt die Kompilierung der Datei stack.cpp noch nicht dafuer, dass auch Code generiert wird. Dies geschieht erst bei der Instanziierung mit konkreten Datentypen (Almetare: nur double und SymOperator*).
Wird ein Stack jetzt in einer anderen Datei als stack.cpp benoetigt (ist bei Bibliotheken ja normal) sollte dort die Inkludierung von stack.h ausreichen, falls die Klasse Stack bzw. die Template-Funktionen mit dem Schluesselwort 'export' qualifiziert werden (Stroustrup Kapitel 13.7 "Templates - Organisation des Quellcodes"). Leider kennen weder GNU noch MSVC++ das Wort 'export'.
Loesung: Entweder man inkludiert stack.cpp in jeder Datei, die Stacks braucht, oder man macht in stack.cpp eine Explizite Instanziierung mit den benoetigten Stack-Typen. Im letzteren Fall ist jedoch Information von der die Bibiothek benutzenden Anwendung in die Bibliotheksdatei gewandert! Die MSVC-Datei VECTOR enthaelt den Code anscheinend auch direkt, ist also eigentlich eine *.cpp-Datei.
Noetig ist ein Zahlen- und ein Symbol-Stack. Man koennte auch direkt die STL-Templates vector<double> und vector<string> nehmen; dieses Template erlaubt es aber, beim Pushen und Poppen den aktuellen Stack auszugeben. Außerdem: Um Klammerebenen abzubilden, werden zwei LISTEN von Stacks benutzt. Bei jeder "(" wird ein neuer Stack auf jede Liste geworfen. Daher enthaelt das Template einen Zeiger auf diese Stack-Liste, die bei jedem Push und Pop ausgegeben wird.
Zusaetzlich wird ein Kommando top eingefuehrt, das den obersten Wert liest, ohne ihn vom Stack zu nehmen.
|
||||||||||
|
|
|
|||||||||
|
|
|
|||||||||
|
|
|
||||||||||
|
Gibt Stack in Debug-Log-Datei aus. Wenn der Listenzeiger gesetzt ist, wird die ganze Liste von Stacks ausgegeben.
|
|
|||||||||
|
Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks.
|
|
||||||||||
|
Push-Funktion mit Ausgabe einer Liste von Stacks.
|
|
||||||||||
|
|
|
||||||||||
|
|
|
|||||||||
|
Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist.
|
|
|||||
|
Liste von Stacks.
|
|
|||||
|
das Element, das vor dem letzten gepusht wurde (noetig fuer "y-Register" der Casio Rechner)
|
1.4.1