aboutsummaryrefslogtreecommitdiff
path: root/stack.c
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2021-12-11 20:18:16 +0100
committerHampusM <hampus@hampusmat.com>2021-12-11 20:18:16 +0100
commitaf4671acbc48446b0e0b3589b648854488f78e58 (patch)
tree46f6676c23b654749c7b173aa348f4c87f3b7044 /stack.c
parenta2bd411d2ee0e3242fc4345a98501283bc749e1c (diff)
refactor: fix formatting & move stack
Diffstat (limited to 'stack.c')
-rw-r--r--stack.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/stack.c b/stack.c
new file mode 100644
index 0000000..651c446
--- /dev/null
+++ b/stack.c
@@ -0,0 +1,41 @@
+#include "stack.h"
+#include <stdlib.h>
+
+// Create a new stack
+struct stack *new_stack(int capacity)
+{
+ struct stack *pt = (struct stack *)malloc(sizeof(struct stack));
+ pt->max_size = capacity;
+ pt->top = -1;
+ pt->items = (int *)malloc(sizeof(int) * capacity);
+ return pt;
+}
+
+// Add a new item to a stack
+void stack_push(struct stack *pt, int x)
+{
+ // Avoid a overflow by checking if the stack is full
+ if (pt->top == pt->max_size - 1)
+ err(0);
+ // Add an element and increase the top index
+ pt->items[++pt->top] = x;
+}
+
+// Get the topmost item of a stack
+int stack_peek(struct stack *pt)
+{
+ // Check if the stack is empty
+ if (pt->top == -1)
+ err(1);
+ return pt->items[pt->top];
+}
+
+// Remove the topmost item of a stack
+int stack_pop(struct stack *pt)
+{
+ // Check for a stack underflow
+ if (pt->top == -1)
+ err(0);
+ // Decrease the stack size by 1 and (optionally) return the popped element
+ return pt->items[pt->top--];
+} \ No newline at end of file