Commit fec6a09

mo khan <mo.khan@gmail.com>
2020-06-28 20:26:27
Insert new node in correct position
1 parent dfe6e2f
Changed files (1)
assignments
assignments/01/min_stack_test.c
@@ -1,15 +1,15 @@
 #include <cgreen/cgreen.h>
 
 /*
-Design and implement a `MinStack` data structure that can store
-comparable elements and supports the stack operations:
+   Design and implement a `MinStack` data structure that can store
+   comparable elements and supports the stack operations:
 
-* `push(x)`
-* `pop()`
-* `size()`
-* `min()`
-All operations should run in constant time.
-*/
+ * `push(x)`
+ * `pop()`
+ * `size()`
+ * `min()`
+ All operations should run in constant time.
+ */
 
 Describe(MinStack);
 BeforeEach(MinStack){ }
@@ -40,12 +40,42 @@ static int size(Stack *stack) {
   return i;
 }
 
-static void push(Stack *stack, int data) {
+static Node *new(int data) {
   Node *node = malloc(sizeof(Node));
   node->next = NULL;
   node->data = data;
+  return node;
+}
+
+static int compare(int x, int y) {
+  return x == y ? 0 : (x > y) ? 1 : -1;
+}
 
-  stack->head = node;
+static void insert(Node **self, int data) {
+  int comparison = compare(data, (*self)->data);
+  Node *node = new(data);
+
+  switch(comparison) {
+    case 1:
+      if ((*self)->next)
+        insert(&((*self)->next), data);
+      else
+        (*self)->next = node;
+      break;
+    case -1:
+      node->next = *self;
+      *self = node;
+      break;
+    default:
+      break;
+  }
+}
+
+static void push(Stack *stack, int data) {
+  if (stack->head)
+    insert(&stack->head, data);
+  else
+    stack->head = new(data);
 }
 
 static int min(Stack *stack) {
@@ -87,10 +117,36 @@ Ensure(MinStack, when_pushing_a_single_integer) {
   free(stack);
 }
 
+Ensure(MinStack, when_pushing_multiple_integers_out_of_order) {
+  Stack *stack = initialize();
+
+  push(stack, 2);
+  push(stack, 3);
+  push(stack, 1);
+
+  assert_that(size(stack), is_equal_to(3));
+  assert_that(min(stack), is_equal_to(1));
+
+  assert_that(pop(stack), is_equal_to(1));
+  assert_that(size(stack), is_equal_to(2));
+
+  assert_that(pop(stack), is_equal_to(2));
+  assert_that(size(stack), is_equal_to(1));
+
+  assert_that(pop(stack), is_equal_to(3));
+  assert_that(size(stack), is_equal_to(0));
+
+  assert_that(pop(stack), is_equal_to(NULL));
+  assert_that(size(stack), is_equal_to(0));
+
+  free(stack);
+}
+
 TestSuite *min_stack_tests() {
   TestSuite *suite = create_test_suite();
 
   add_test_with_context(suite, MinStack, when_empty);
   add_test_with_context(suite, MinStack, when_pushing_a_single_integer);
+  add_test_with_context(suite, MinStack, when_pushing_multiple_integers_out_of_order);
   return suite;
 }