#include "position_stack.h" #include "utils.h" #include #include // Error handler for stack errors void stack_error(int err) { switch (err) { case STACK_ERR_OVERFLOW: printf("Error: Stack overflow\nBe kind and report this problem."); break; case STACK_ERR_UNDERFLOW: printf("Error: Stack underflow\nBe kind and report this problem."); break; } exit(1); } // Creates a new stack PositionStack *pos_stack_create(unsigned int capacity) { PositionStack *pos_stack = malloc_s(sizeof(PositionStack)); pos_stack->capacity = capacity; pos_stack->top = -1; pos_stack->items = malloc_s(sizeof(Position) * capacity); return pos_stack; } void pos_stack_destroy(PositionStack *pos_stack) { free(pos_stack->items); free(pos_stack); } // Adds a new item to a stack void pos_stack_push(PositionStack *pos_stack, Position pos) { // Avoid a overflow by checking if the stack is full if (pos_stack->top == pos_stack->capacity - 1) { stack_error(STACK_ERR_OVERFLOW); } // Add an element and increase the top index pos_stack->items[++pos_stack->top] = pos; } // Returns the topmost item of a stack Position pos_stack_peek(PositionStack *pos_stack) { // Avoid a underflow by checking if the stack is empty if (pos_stack->top == -1) { stack_error(STACK_ERR_UNDERFLOW); } return pos_stack->items[pos_stack->top]; } // Deletes the topmost item of a stack Position pos_stack_pop(PositionStack *pos_stack) { // Avoid a underflow by checking if the stack is empty if (pos_stack->top == -1) { stack_error(STACK_ERR_UNDERFLOW); } // Decrease the stack size by 1 and return the popped element return pos_stack->items[pos_stack->top--]; }