X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=templates%2Fstack.c;fp=templates%2Fstack.c;h=bf9c7a5e5e660042f23fbfcb4707178188db7aef;hp=0000000000000000000000000000000000000000;hb=c45c61444aae3df328e4dc84acf7e31e58a1f64e;hpb=268127b1e817f0dfe298d66e6cacdb0bb83139fb diff --git a/templates/stack.c b/templates/stack.c new file mode 100644 index 0000000..bf9c7a5 --- /dev/null +++ b/templates/stack.c @@ -0,0 +1,47 @@ +struct StackNode; +typedef struct StackNode StackNode; +struct StackNode { + Object value; + StackNode* next; +}; + +struct Stack; +typedef struct Stack Stack; +struct Stack { + StackNode* top; +}; + +void Stack_initialize(Stack* self) { + self->top = NULL; +} + +bool Stack_isEmpty(Stack* self) { + return self->top == NULL; +} + +Object Stack_pop(Stack*); + +void Stack_deinitialize(Stack* self) { + while(self->top != NULL) { + Object o = Stack_pop(self); + Object_deinitialize(&o); + } +} + +void Stack_push(Stack* self, Object value) { + StackNode* node = malloc(sizeof(StackNode)); + node->value = value; + node->next = self->top; + self->top = node; +} + +Object Stack_pop(Stack* self) { + assert(self->top != NULL); + + StackNode* node = self->top; + self->top = node->next; + + Object result = node->value; + free(node); + return result; +}