+#include <stdlib.h>
+#include "stack.h"
+
+typedef struct _Stack {
+ void** elems;
+ int size;
+} Stack;
+
+Stack* stack_init() {
+ Stack* s = malloc(sizeof(Stack));
+ s->size = 0;
+ s->elems = NULL;
+ return s;
+}
+
+void* stack_pop(Stack* stack) {
+ if (stack_empty(stack))
+ return NULL;
+ stack->size -= 1;
+ void* elem = stack->elems[stack->size];
+ stack->elems[stack->size] = NULL;
+ stack->elems = realloc(stack->elems, stack->size * sizeof(void*));
+
+ return elem;
+}
+
+void stack_push(Stack* stack, void* elem) {
+ if (stack == NULL)
+ return;
+
+ stack->size += 1;
+ stack->elems = realloc(stack->elems, stack->size * sizeof(void*));
+ stack->elems[stack->size - 1] = elem;
+}
+
+void* stack_peek(Stack* stack) {
+ if (stack_empty(stack))
+ return NULL;
+ return stack->elems[stack->size - 1];
+}
+
+bool stack_empty(Stack* stack) {
+ return (stack == NULL || stack->size == 0);
+}
+
+void** stack_clear(Stack** stack) {
+ if (*stack == NULL)
+ return NULL;
+ void** elems = (*stack)->elems;
+ free(*stack);
+ *stack = NULL;
+ return elems;
+}