diff options
Diffstat (limited to 'data_structures/chapter_3/stack.c')
| -rw-r--r-- | data_structures/chapter_3/stack.c | 120 |
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; +} |
