aboutsummaryrefslogtreecommitdiff
path: root/stack2.c
diff options
context:
space:
mode:
Diffstat (limited to 'stack2.c')
-rw-r--r--stack2.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/stack2.c b/stack2.c
new file mode 100644
index 0000000..57dce4f
--- /dev/null
+++ b/stack2.c
@@ -0,0 +1,100 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <stdbool.h>
4
5#include "util.h"
6
7typedef int T;
8
9struct stack {
10 T *array;
11 size_t sz, p;
12};
13
14void
15stack_init(struct stack *stack)
16{
17 stack->array = NULL;
18 stack->sz = 0;
19 stack->p = 0;
20}
21
22bool
23stack_push(struct stack *stack, T data)
24{
25 if ( stack->array == NULL ) {
26 if ( (stack->array = malloc(10 * sizeof(*stack->array))) != NULL ) {
27 stack->sz = 10;
28 stack->p = 0;
29 }
30 else {
31 ERROR("out of memory");
32 return false;
33 }
34 }
35
36 if ( stack->p == stack->sz ) {
37 size_t new_sz;
38 T *new_array;
39
40 if ( (new_array = realloc(stack->array, (new_sz = (stack->sz * 3 / 2)) * sizeof(*stack->array))) != NULL ) {
41 stack->array = new_array;
42 stack->sz = new_sz;
43 }
44 else {
45 ERROR("out of memory");
46 return false;
47 }
48 }
49
50 stack->array[stack->p++] = data;
51 return true;
52}
53
54bool
55stack_pop(struct stack *stack, T *data)
56{
57 if ( stack->p != 0 ) {
58 *data = stack->array[--stack->p];
59 return true;
60 }
61 else
62 return false;
63}
64
65bool
66stack_empty(struct stack *stack)
67{
68 return stack->p == 0;
69}
70
71void
72stack_free(struct stack *stack)
73{
74 free(stack->array);
75}
76
77int
78main()
79{
80 struct stack stack[1];
81
82 stack_init(stack);
83
84 for ( int i = 0; i != 20; ++i )
85 stack_push(stack, i);
86
87 while ( !stack_empty(stack) ) {
88 int i;
89
90 if ( stack_pop(stack, &i) )
91 printf("%d\n", i);
92 else
93 ERROR("this shouldn't happen!");
94 }
95
96 stack_free(stack);
97
98 return EXIT_SUCCESS;
99}
100