#include #include "stack.h" //TODO: grundlegende Stackfunktionen implementieren: /* * `push`: legt ein Element oben auf den Stack, * `pop`: entfernt das oberste Element, * `top`: liefert das oberste Element zurück, * `clearStack`: gibt den gesamten Speicher frei. */ // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { // Speicher reservieren für neuen Knoten (muss auf dem Heap liegen!) StackNode *newNode = malloc(sizeof(StackNode)); if (!newNode) return stack; // Fehlerfall: Speicher konnte nicht allokiert werden newNode->data = data; // Datenpointer übernehmen newNode->next = stack; // Der bisherige Stack ist jetzt der Nächste (LIFO) return newNode; // Der neue Knoten ist jetzt die Spitze des Stacks } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be freed by caller.) StackNode *pop(StackNode *stack) { // Check, ob der Stack leer ist if (!stack) return NULL; StackNode *next = stack->next; // Speichere den Pointer auf das nächste Element free(stack); // Gib den Speicher des obersten Knotens frei return next; // Gebe das neue oberste Element zurück } // Returns the data of the top element. void *top(StackNode *stack) { // Check, ob der Stack leer ist if (!stack) return NULL; // Gebe nur die Daten zurück, ohne den Stack zu verändern return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { // Iteriere solange, bis der Stack leer ist while(stack != NULL) { StackNode *next = stack->next; // Speichere den Nachfolger free(stack); // Gib den aktuellen Knoten frei stack = next; // Gehe zum nächsten Knoten } }