/* * unboundedStack.c - nicht-begrenzter Stack * * Blatt 2, Aufgabe 1, Grundlagen der Informatik 2 fuer E-Techniker * SoSe 2002, (c) Jan Bredereke * * $Id: unboundedStack.c,v 1.3 2002/05/29 15:47:37 brederek Exp $ */ #include #include #include #include "unboundedStack.h" /* * Eine einfach verkettete Liste, zugleich auch * einzelnes Element einer solchen Liste. */ struct stackList { struct stackItem* item; /* Inhalt dieses Listenelements */ struct stackList* prev; /* voriges Listenelement */ }; /* Die Funktionen. */ /* * Erzeugt einen Stack. * * @return Der neue, leere Stack. */ stackH createStack(void) { stackH newStack; newStack = (stackH) malloc(sizeof(struct stack)); assert(newStack != NULL); newStack->top = NULL; } /* * Legt das uebergebene Element oben auf den Stack. * * @param obj Das auf den Stack zu legende Element. */ void push(stackH s, struct stackItem si) { struct stackList *temp; /* ein neues Listenelement */ assert(s != NULL); temp = (struct stackList *) malloc(sizeof(struct stackList)); assert(temp != NULL); temp->item = (struct stackItem *) malloc(sizeof(struct stackItem)); assert(temp->item != NULL); memcpy((void *) temp->item, (void *) &si, sizeof(struct stackItem)); temp->prev = s->top; s->top = temp; } /* * Nimmt das oberste Element vom Stack und gibt es zurueck. * * @return Das oberste Element. */ struct stackItem pop(stackH s) { struct stackItem item; /* Puffer fuer das oberste Element */ struct stackList *elem; /* Merker fuer das erste Listenelement */ assert(s != NULL); assert(s->top != NULL); elem = s->top; memcpy((void *) &item, (void *) elem->item, sizeof(struct stackItem)); s->top = elem->prev; free((void *) elem->item); free((void *) elem); return item; } /* * Gibt das oberste Element vom Stack zurueck, ohne den Stack zu * veraendern. * * @return Das oberste Element. */ struct stackItem peek(stackH s) { assert(s != NULL); assert(s->top != NULL); return *(s->top->item); } /** * Sagt, ob der Stack leer ist. * * @return 1, falls Stack leer, 0 sonst. */ int isEmpty(stackH s) { assert(s != NULL); return (s->top == NULL); }