diff options
Diffstat (limited to 'stack.c')
| -rw-r--r-- | stack.c | 65 |
1 files changed, 65 insertions, 0 deletions
@@ -0,0 +1,65 @@ +#include "./stack.h" +#include <stdbool.h> +#include <stdlib.h> + +bool stack_is_empty(stack *s) +{ + if (!s || s->top == -1) { + return true; + } + + return false; +} + +stack *new_stack(size_t size) +{ + stack *s = malloc(sizeof(stack)); + if (!s) + return NULL; + + s->data = malloc(size * sizeof(void *)); + if (!s->data) { + free(s); + return NULL; + } + + s->capacity = size; + s->top = -1; + return s; +} + +void free_stack(stack *s) +{ + if (!s) + return; + + free(s->data); + free(s); +} + +void *pop(stack *s) +{ + if (stack_is_empty(s)) + return NULL; + return s->data[s->top--]; +} + +void *peek(stack *s) +{ + if (stack_is_empty(s)) + return NULL; + return s->data[s->top]; +} + +void *push(stack *s, void *data) +{ + if (!s) + return NULL; + + if (s->top + 1 >= s->capacity) { + s->capacity *= 2; + s->data = realloc(s->data, sizeof(void *) * s->capacity); + } + + return s->data[++s->top] = data; +} |
