X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=src%2FStack.c;h=41c9bbc4c0e9ca951654239774e6bae2405c6e5f;hb=e45132acdb58c076d5e06849fa51c26de9a7486d;hp=c37b775f660561051409e3b8feac95224a396ab4;hpb=a78687686f5b490d99fae21f9fa8aaa9a34f1812;p=cgds.git diff --git a/src/Stack.c b/src/Stack.c index c37b775..41c9bbc 100644 --- a/src/Stack.c +++ b/src/Stack.c @@ -6,79 +6,59 @@ void _stack_init(Stack* stack, size_t dataSize) { - stack->size = 0; - stack->dataSize = dataSize; - stack->top = NULL; + stack->dataSize = dataSize; + _vector_init(stack->array, dataSize); } Stack* _stack_new(size_t dataSize) { - Stack* stack = (Stack*) safe_malloc(sizeof (Stack)); - _stack_init(stack, dataSize); - return stack; + Stack* stack = (Stack*) safe_malloc(sizeof (Stack)); + stack->array = _vector_new(dataSize); + _stack_init(stack, dataSize); + return stack; } Stack* stack_copy(Stack* stack) { - // since a stack is a single-linked list, an auxiliary storage is required - void** tmpStorage = (void**) malloc(stack->size * sizeof (void*)); - StackCell* stackCell = stack->top; - for (UInt i = 0; i < stack->size; i++) - { - tmpStorage[stack->size - 1 - i] = stackCell->data; - stackCell = stackCell->previous; - } - // now transfer tmpStorage contents (pushed in right order) in a new stack - Stack* stackCopy = _stack_new(stack->dataSize); - for (UInt i = 0; i < stack->size; i++) - _stack_push(stackCopy, tmpStorage[i]); - free(tmpStorage); - return stackCopy; + Stack* stackCopy = (Stack*) safe_malloc(sizeof (Stack)); + stackCopy->dataSize = stack->dataSize; + Vector* arrayCopy = vector_copy(stack->array); + stackCopy->array = arrayCopy; + return stackCopy; } -Bool stack_empty(Stack* stack) +bool stack_empty(Stack* stack) { - return (stack->size == 0); + return vector_empty(stack->array); } UInt stack_size(Stack* stack) { - return stack->size; + return vector_size(stack->array); } void _stack_push(Stack* stack, void* data) { - StackCell* newStackTop = (StackCell*) safe_malloc(sizeof (StackCell)); - newStackTop->data = safe_malloc(stack->dataSize); - memcpy(newStackTop->data, data, stack->dataSize); - newStackTop->previous = stack->top; - stack->top = newStackTop; - stack->size++; + _vector_push(stack->array, data); } void* _stack_top(Stack* stack) { - return stack->top->data; + return _vector_get(stack->array, vector_size(stack->array)-1); } void stack_pop(Stack* stack) { - StackCell* toTrash = stack->top; - stack->top = stack->top->previous; - safe_free(toTrash->data); - safe_free(toTrash); - stack->size--; + vector_pop(stack->array); } void stack_clear(Stack* stack) { - while (stack->size > 0) - stack_pop(stack); - _stack_init(stack, stack->dataSize); + vector_clear(stack->array); } void stack_destroy(Stack* stack) { - stack_clear(stack); - safe_free(stack); + vector_destroy(stack->array); + safe_free(stack); }