diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/02/05/stack.c | 36 | ||||
| -rw-r--r-- | src/02/05/stack.h | 6 | ||||
| -rw-r--r-- | src/02/05/stack_test.c | 31 |
3 files changed, 55 insertions, 18 deletions
diff --git a/src/02/05/stack.c b/src/02/05/stack.c index 26ef956..cbfd91e 100644 --- a/src/02/05/stack.c +++ b/src/02/05/stack.c @@ -8,19 +8,9 @@ Node *node_init(int data) { return node; } -Node *node_tail(Node *self) { - Node *current = self; - while (current) { - if (current->next == NULL) - return current; - current = current->next; - } - return NULL; -} - -Stack *stack_init(int data) { +Stack *stack_init() { Stack *stack = malloc(sizeof(Stack)); - stack->head = node_init(data); + stack->head = NULL; return stack; } @@ -39,8 +29,24 @@ int stack_size(Stack *self) { } int stack_peek(Stack *self) { - Node *tail = node_tail(self->head); - if (tail) - return tail->data; + if (self->head) + return self->head->data; + return -1; +} + +void stack_push(Stack *stack, int data) { + Node *node = node_init(data); + node->next = stack->head; + stack->head = node; +} + +int stack_pop(Stack *self) { + if (self->head) { + Node *tmp = self->head; + int data = tmp->data; + self->head = self->head->next; + free(tmp); + return data; + } return -1; } diff --git a/src/02/05/stack.h b/src/02/05/stack.h index 12d78f5..a3f424e 100644 --- a/src/02/05/stack.h +++ b/src/02/05/stack.h @@ -7,6 +7,8 @@ typedef struct { Node *head; } Stack; -Stack *stack_init(int data); -int stack_size(Stack *self); +Stack *stack_init(); int stack_peek(Stack *self); +int stack_size(Stack *self); +void stack_push(Stack *self, int data); +int stack_pop(Stack *self); diff --git a/src/02/05/stack_test.c b/src/02/05/stack_test.c index c2ec4c2..5c74290 100644 --- a/src/02/05/stack_test.c +++ b/src/02/05/stack_test.c @@ -7,14 +7,43 @@ BeforeEach(Stack) {} AfterEach(Stack) {} Ensure(Stack, when_pushing_an_item_on_to_a_stack) { - Stack *stack = stack_init(10); + Stack *stack = stack_init(); + + stack_push(stack, 10); assert_that(stack_size(stack), is_equal_to(1)); assert_that(stack_peek(stack), is_equal_to(10)); } +Ensure(Stack, when_pushing_multiple_items_on_to_a_stack) { + Stack *stack = stack_init(); + + stack_push(stack, 20); + stack_push(stack, 10); + stack_push(stack, 50); + + assert_that(stack_size(stack), is_equal_to(3)); + assert_that(stack_peek(stack), is_equal_to(50)); +} + +Ensure(Stack, when_popping_an_item_off_of_a_stack) { + Stack *stack = stack_init(); + + stack_push(stack, 20); + stack_push(stack, 10); + stack_push(stack, 50); + + int result = stack_pop(stack); + + assert_that(stack_size(stack), is_equal_to(2)); + assert_that(stack_peek(stack), is_equal_to(10)); + assert_that(result, is_equal_to(50)); +} + TestSuite *stack_tests() { TestSuite *suite = create_test_suite(); add_test_with_context(suite, Stack, when_pushing_an_item_on_to_a_stack); + add_test_with_context(suite, Stack, when_pushing_multiple_items_on_to_a_stack); + add_test_with_context(suite, Stack, when_popping_an_item_off_of_a_stack); return suite; } |
