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