Commit 2fc19c9
Changed files (3)
src
02
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;
}
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);
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;
}