Commit 2fc19c9

mo khan <mo.khan@gmail.com>
2020-08-06 03:42:35
Implement stack_pop
1 parent 8ebf2af
Changed files (3)
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;
 }