aboutsummaryrefslogtreecommitdiff
path: root/position_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'position_stack.c')
-rw-r--r--position_stack.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/position_stack.c b/position_stack.c
new file mode 100644
index 0000000..3d546b8
--- /dev/null
+++ b/position_stack.c
@@ -0,0 +1,69 @@
+#include "position_stack.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+// 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--];
+} \ No newline at end of file