Simple stack
4/2/2020
I'm exploring data structures and I find I learn best when I put something out, so first with a stack. This is my simple implementation using an array. A linked list would be better but that's more verbose.
/* * stack using array */ #include <stdio.h> #include <stdlib.h> struct stack { ssize_t size; ssize_t top; int *array; }; struct stack *createstack(size_t size) { struct stack *stack = malloc(sizeof(struct stack)); stack->size = size; stack->top = -1; stack->array = malloc(sizeof(int) * stack->size); return stack; } void destroystack(struct stack *stack) { free(stack->array); free(stack); } int isempty(struct stack *stack) { return (stack->top == -1); } void pushstack(struct stack *stack, int val) { if (stack->top+1 > stack->size) { fprintf(stderr, "stack is full, can't push\n"); return; } stack->top++; stack->array[stack->top] = val; } int popstack(struct stack *stack) { if (isempty(stack)) { fprintf(stderr, "stack is empty, can't pop\n"); /* in the real world we would not be holding ints so -1 will do */ return -1; } int popped = stack->array[stack->top]; stack->top--; return popped; } int peekstack(struct stack *stack) { if (isempty(stack)) { fprintf(stderr, "stack is empty, can't peek\n"); return -1; } return stack->array[stack->top]; } void printstack(struct stack *stack) { if (isempty(stack)) { fprintf(stderr, "stack is empty\n"); } for (ssize_t i = 0; i <= stack->top; i++) { printf("[%zd] = %d\n", i, stack->array[i]); } } int main(void) { struct stack *stack = createstack(50); printf("isempty: %d\n", isempty(stack)); pushstack(stack, 5); pushstack(stack, 10); pushstack(stack, 15); printf("peek: %d\n", peekstack(stack)); printf("isempty: %d\n", isempty(stack)); printstack(stack); puts("popstack()"); printf("popped: %d\n", popstack(stack)); printstack(stack); printf("popped: %d\n", popstack(stack)); printstack(stack); printf("popped: %d\n", popstack(stack)); printstack(stack); destroystack(stack); return 0; }