summaryrefslogtreecommitdiff
path: root/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'stack.c')
-rw-r--r--stack.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/stack.c b/stack.c
new file mode 100644
index 0000000..c07c7fc
--- /dev/null
+++ b/stack.c
@@ -0,0 +1,45 @@
+#include <stdlib.h>
+
+typedef struct stack stack;
+
+typedef struct stack {
+ char *tape;
+ int len;
+ char *ptr;
+} stack;
+
+stack *push(stack *s, char c){
+ if (s == NULL) {
+ stack *outstack = malloc(sizeof(stack));
+ outstack->tape = malloc(1);
+ outstack->tape[0] = c;
+ outstack->ptr = outstack->tape;
+ outstack->len = 1;
+ return outstack;
+ }
+ s->len++;
+ s->ptr++;
+ s->tape = realloc(s->tape, s->len);
+ *s->ptr = c;
+
+ return s;
+}
+
+char pop(stack *s){
+ char c = *s->ptr;
+ *s->ptr = 0;
+ s->len--;
+ s->ptr--;
+ s->tape = realloc(s->tape, s->len);
+
+ return c;
+}
+
+char peek(stack *s){
+ return *s->ptr;
+}
+
+void cleanstack(stack *s){
+ free(s->tape);
+ free(s);
+}