From 154874afda4a8df885e51c01f7681f04fb0b8e61 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 9 Apr 2022 09:43:53 +0200 Subject: neue Verzeichnisstruktur --- src/stack2.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/stack2.c (limited to 'src/stack2.c') 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 @@ +#include +#include +#include + +#include "util.h" + +/* --8<-- stack2_type */ +typedef int T; + +struct stack { + T * array; + size_t sz, p; +}; +/* -->8-- */ + +/* --8<-- stack2_init */ +void +stack_init(struct stack *stack) +{ + stack->array = NULL; + stack->sz = 0; + stack->p = 0; +} +/* -->8-- */ + +/* --8<-- stack2_push */ +bool +stack_push(struct stack *stack, T data) +{ + if ( stack->array == NULL ) { + if ( (stack->array = malloc(10 * sizeof *stack->array)) != NULL ) { + stack->sz = 10; + stack->p = 0; + } + else { + ERROR("out of memory"); + return false; + } + } + + if ( stack->p == stack->sz ) { + size_t new_sz; + T * new_array; + + if ( (new_array = realloc(stack->array, (new_sz = (stack->sz * 3 / 2)) * sizeof *stack->array)) != NULL ) { + stack->array = new_array; + stack->sz = new_sz; + } + else { + ERROR("out of memory"); + return false; + } + } + + stack->array[stack->p++] = data; + return true; +} +/* -->8-- */ + +/* --8<-- stack2_pop */ +bool +stack_pop(struct stack *stack, T *data) +{ + if ( stack->p != 0 ) { + --stack->p; + + if ( data ) { + *data = stack->array[stack->p]; + } + return true; + } + else + return false; +} +/* -->8-- */ + +/* --8<-- stack2_empty */ +bool +stack_empty(struct stack *stack) +{ + return stack->p == 0; +} +/* -->8-- */ + +/* --8<-- stack2_free */ +void +stack_free(struct stack *stack) +{ + free(stack->array); +} +/* -->8-- */ + +int +main() +{ + struct stack stack[1]; + + stack_init(stack); + + for ( int i = 0; i != 20; ++i ) + stack_push(stack, i); + + while ( !stack_empty(stack) ) { + int i; + + if ( stack_pop(stack, &i) ) + printf("%d\n", i); + else + ERROR("this shouldn't happen!"); + } + + stack_free(stack); + + return EXIT_SUCCESS; +} -- cgit v1.3