Stacks
Nur ein Datenein und -Ausgang
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 2
Was ist ein Stack (Keller)?
Eine Listenstruktur, mit nur einem internen Zeiger SP (Stack Pointer)
Last In First Out (LIFO) Prinzip, d.h das zuletzt eingefügte Element
wird das erste, das entfernt wird
Stack-Struktur
…
SP
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 4
Stackoperationen
Stack initialisieren: void initStack()
Prüfen, ob Stack leer ist: int istLeer()
Datenelement vom Typ DATA einfügen:
void push(DATA)
Datenelement vom Stack entfernen:
DATA pop()
Die Include-Datei "stack.h"
#ifndef NULL
#define NULL 0
#endif
typedef ... DATA;
typedef struct StackKnoten { DATA d;
struct StackKnoten
*Naechster;
} STACKKNOTEN;
typedef STACKKNOTEN *STACK_POINTER;
STACK_POINTER SP;
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 6
Bemerkungen
SP ist eine (interne) Variable
stack.h darf nur einmal im
Programm includiert werden
Anwender sieht die typedefs und die Variable SP nicht
Die Stack-Operationen I
void initStack {
SP = NULL;
}
int istLeer() {
return (SP == NULL);
}
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 8
Die Stack-Operationen II
DATA pop() {
DATA temp;
STACK_POINTER where;
if (!istLeer()){
temp = SP->d;
where = SP;
SP = SP->Naechster;
free(where);
return temp;}
else{
fprintf(stderr, "Stack ist leer!\n");
exit(1);
} }
Die Stack-Operationen III
void push (DATA x) {
STACK_POINTER temp;
temp = (STACK_POINTER)malloc(sizeof(STACKKNOTEN));
temp->d = x;
temp->next = SP;
SP = temp;
}
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 10
Anwendung:
Umgekehrte Polnische Notation
Statt 1 + 2 schreibe man 1 2 +
Zuerst die Operand(en), dann der Operator
Notation ist Klammer-frei
Beispiel (a - b)*c wird a b - c *
geschrieben
Ausdrücke werden von links nach rechts ausgewertet
Beispiel
Polnischer Ausdruck 5 4 + 6 * 4 -
5 5
4
9 9
6
54
4
50
push push pop push pop push pop
54
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 12
Algorithmus
while (nextsym != EndSym)
if (nextsym == Operator)
pop oberste 2 Stackelemente
wende Operator auf diese Stackelemente an
push Ergebnis
else
push nextsym
Bemerkungen
Stackelemente können entweder Zahlen oder Operatoren enthalten, d.h. Union
Zahlen müssen von char nach int umgewandelt werden
Ausdruck wird als Reihung von solchen Unions abgespeichert
20.12.2002 Prof. Zavodnik / C Vorlesung / Kapitel VIII 14
Bemerkung
Tag-Feld in DATA Struktur, um feststellen zu können, ob Inhalt Operator oder Operand ist
Auch möglich: Ausdruck selbst in einer Stack-Struktur speichern
Zweiter Stack wird für Auswertung gebraucht
Programm
Siehe Folie
Wenn der Ausdruck syntaktisch korrekt ist, ist das Ergebnis das einzige Element im Stack
Ist dies nicht der Fall, dann gibt es einen Fehler