diff options
| author | verdant <i@glowisle.me> | 2026-05-24 13:55:39 +0800 |
|---|---|---|
| committer | verdant <i@glowisle.me> | 2026-05-24 13:55:39 +0800 |
| commit | b6fe9fc6a4f31d4fa0ddad7fdfd3324cd1c88d3e (patch) | |
| tree | be10b7b732e8358a0fa1bb0b407903fae1fa91c6 /stack.c | |
| download | vmp-b6fe9fc6a4f31d4fa0ddad7fdfd3324cd1c88d3e.tar.gz vmp-b6fe9fc6a4f31d4fa0ddad7fdfd3324cd1c88d3e.zip | |
Initial commit
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; +} |
