#include "position_stack.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 struct PositionStack *create_pos_stack(int capacity) { struct PositionStack *stack_pt = malloc(sizeof(struct PositionStack)); stack_pt->max_size = capacity; stack_pt->top = -1; stack_pt->items = malloc(sizeof(struct Position) * capacity); return stack_pt; } // Adds a new item to a stack void pos_stack_push(struct PositionStack *stack_pt, struct Position pos) { // Avoid a overflow by checking if the stack is full if (stack_pt->top == stack_pt->max_size - 1) { stack_error(STACK_ERR_OVERFLOW); } // Add an element and increase the top index stack_pt->items[++stack_pt->top] = pos; } // Returns the topmost item of a stack struct Position pos_stack_peek(struct PositionStack *stack_pt) { // Avoid a underflow by checking if the stack is empty if (stack_pt->top == -1) { stack_error(STACK_ERR_UNDERFLOW); } return stack_pt->items[stack_pt->top]; } // Deletes the topmost item of a stack struct Position pos_stack_pop(struct PositionStack *stack_pt) { // Avoid a underflow by checking if the stack is empty if (stack_pt->top == -1) { stack_error(STACK_ERR_UNDERFLOW); } // Decrease the stack size by 1 and return the popped element return stack_pt->items[stack_pt->top--]; }