aboutsummaryrefslogtreecommitdiff
path: root/data_structures/chapter_3/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'data_structures/chapter_3/stack.c')
-rw-r--r--data_structures/chapter_3/stack.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/data_structures/chapter_3/stack.c b/data_structures/chapter_3/stack.c
new file mode 100644
index 0000000..a27869f
--- /dev/null
+++ b/data_structures/chapter_3/stack.c
@@ -0,0 +1,120 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "stack.h"
+
+/* Stack implementation is a linked list with a header */
+struct node
+{
+ elem data;
+ ptr_to_node next;
+};
+
+int is_empty(stack s)
+{
+ return s->next == NULL;
+}
+
+stack create_stack()
+{
+ stack s;
+
+ s = malloc(sizeof(struct node));
+ if(s == NULL)
+ printf("error");
+ make_empty(s);
+ return s;
+}
+
+void make_empty(stack s)
+{
+ if(s == NULL)
+ printf("must create a stack first");
+ else
+ while(!is_empty(s))
+ pop(s);
+}
+
+void push(elem x, stack s)
+{
+ ptr_to_node tmp;
+
+ tmp = malloc(sizeof(struct node));
+ if(tmp == NULL)
+ printf("out of space");
+ else {
+ tmp->data = x;
+ tmp->next = s->next;
+ s->next = tmp;
+ }
+}
+
+void pop(stack s)
+{
+ if(!is_empty(s)) {
+ ptr_to_node tmp = s->next;
+ s->next = s->next->next;
+ free(tmp);
+ } else
+ printf("Empty stack");
+}
+
+elem top(stack s)
+{
+// if(is_empty(s))
+// printf("empty stack");
+// else
+// return s->next->data;
+//
+// return -1;
+//
+/* tune version */
+ if(!is_empty(s))
+ return s->next->data;
+
+ printf("empty stack");
+ return 0;
+}
+
+void print_stack(stack s)
+{
+ printf("--------\n");
+ while(!is_empty(s)) {
+ printf(" %d\n", s->next->data);
+ s = s->next;
+ }
+ printf("--------\n");
+}
+
+void test()
+{
+ stack s;
+ s = create_stack();
+ push(1, s);
+ push(2, s);
+ print_stack(s);
+
+ push(3, s);
+ push(4, s);
+ push(5, s);
+ print_stack(s);
+ printf("%d\n",top(s));
+
+ pop(s);
+ print_stack(s);
+
+ pop(s);
+ pop(s);
+ pop(s);
+ pop(s);
+ pop(s);
+ pop(s);
+
+ print_stack(s);
+}
+
+int main()
+{
+ test();
+ return 0;
+}