diff --git a/main.c b/main.c index 839c8cd9a755a87fe076a8687e94630d71d6f1ed..1673221c77fda97cc374c38093181d39f2dd0fbc 100644 --- a/main.c +++ b/main.c @@ -14,59 +14,65 @@ #include "stack.h" -void sort_array(int *array, int array_length) { - stack s_a; - stack_init(&s_a, array_length); - stack s_b; - stack_init(&s_b, array_length); - - for (int i = 0; i < array_length; i += 1) { - // Pop values from left stack to right stack. - while (!stack_is_empty(s_a)) { - int tmp; - stack_peek(s_a, &tmp); - - if (array[i] < tmp) { - break; - } +void pop_left_push_right(stack *left_stack, stack *right_stack, int current_value) { + while (!stack_is_empty(*left_stack)) { + int tmp; + stack_peek(*left_stack, &tmp); - stack_pop(&s_a, &tmp); - stack_push(&s_b, tmp); + if (current_value < tmp) { + break; } - // Pop values from right stack to left stack. - while (!stack_is_empty(s_b)) { - int tmp; - stack_peek(s_b, &tmp); + stack_pop(left_stack, &tmp); + stack_push(right_stack, tmp); + } +} - if (array[i] > tmp) { - break; - } +void pop_right_push_left(stack *right_stack, stack *left_stack, int current_value) { + while (!stack_is_empty(*right_stack)) { + int tmp; + stack_peek(*right_stack, &tmp); - stack_pop(&s_b, &tmp); - stack_push(&s_a, tmp); + if (current_value > tmp) { + break; } + stack_pop(right_stack, &tmp); + stack_push(left_stack, tmp); + } +} + +void sort_array(int *array, int array_length) { + stack left_stack; + stack_init(&left_stack, array_length); + stack right_stack; + stack_init(&right_stack, array_length); + + for (int i = 0; i < array_length; i += 1) { + // Pop values from left stack to right stack. + pop_left_push_right(&left_stack, &right_stack, array[i]); + // Pop values from right stack to left stack. + pop_right_push_left(&right_stack, &left_stack, array[i]); // Push to left stack. - stack_push(&s_a, array[i]); + stack_push(&left_stack, array[i]); } // Until right stack is empty pop value from right stack and push it to left stack. - while (!stack_is_empty(s_b)) { + while (!stack_is_empty(right_stack)) { int tmp; - stack_pop(&s_b, &tmp); - stack_push(&s_a, tmp); + stack_pop(&right_stack, &tmp); + stack_push(&left_stack, tmp); } // Until the left stack is empty, pop the value and place it in the array. for (int i = 0; i < array_length; i += 1) { int tmp; - stack_pop(&s_a, &tmp); + stack_pop(&left_stack, &tmp); array[i] = tmp; } - stack_destroy(&s_a); - stack_destroy(&s_b); + stack_destroy(&left_stack); + stack_destroy(&right_stack); } void print_array(int *array, int array_length) { @@ -77,9 +83,14 @@ void print_array(int *array, int array_length) { } int main(int argc, char **argv) { + if (argc < 2) { + printf("Too few arguments.\n"); + return EXIT_FAILURE; + } + int array_length = atoi(argv[1]); - if (array_length != argc - 2) { + if (array_length != argc - 2 || array_length == 0) { printf("The length of the array does not correspond to the number of elements.\n"); return EXIT_FAILURE; } diff --git a/stack.c b/stack.c index 7ed0ae7cf6ec518e6d093e75ddf255b0aa74d6a4..07e3cd907b96434abb4871bb2e4842f90f41aeff 100644 --- a/stack.c +++ b/stack.c @@ -34,11 +34,19 @@ void stack_push(stack *s, int val) { } void stack_pop(stack *s, int *val) { + if (stack_is_empty(*s)) { + return; + } + stack_peek(*s, val); s->top -= 1; } void stack_peek(stack s, int *val) { + if (stack_is_empty(s)) { + return; + } + *val = s.data[s.top]; } diff --git a/stack_tests.c b/stack_tests.c index ce8af6dea75add113322b7139d2125f21c1c9f0f..23c6f0dc03eeba5aaeb2a083977fe7f179daf36f 100644 --- a/stack_tests.c +++ b/stack_tests.c @@ -9,12 +9,11 @@ * */ - -#include "stack.h" - #include <assert.h> #include <stdlib.h> +#include "stack.h" + int main() { const int STACK_LENGTH = 10; @@ -45,6 +44,17 @@ int main() { assert(s2.top == 2); stack_destroy(&s2); + // Test : stack_push (size overflow) + stack s2b; + stack_init(&s2b, 2); + stack_push(&s2b, 1); + stack_push(&s2b, 2); + // Overflow from here. + stack_push(&s2b, 3); + stack_push(&s2b, 4); + assert(s2b.top == 1); + stack_destroy(&s2b); + // Test : stack_is_empty stack s3; stack_init(&s3, STACK_LENGTH); @@ -53,7 +63,7 @@ int main() { assert(!stack_is_empty(s3)); stack_destroy(&s3); - // Test : stack_push + // Test : stack_pop stack s4; stack_init(&s4, STACK_LENGTH); stack_push(&s4, 1); @@ -67,6 +77,14 @@ int main() { assert(s4.top == -1); stack_destroy(&s4); + // Test : stack_pop (stack is empty) + stack s4b; + stack_init(&s4b, STACK_LENGTH); + int val1b; + stack_pop(&s4b, &val1b); + assert(s4b.top == -1); + stack_destroy(&s4b); + // Test : stack_peek stack s5; stack_init(&s5, STACK_LENGTH); @@ -76,4 +94,12 @@ int main() { assert(val2 == 1); assert(s5.top == 0); stack_destroy(&s5); + + // Test : stack_peek (stack is empty) + stack s5b; + stack_init(&s5b, STACK_LENGTH); + int val2b; + stack_peek(s5b, &val2b); + assert(s5b.top == -1); + stack_destroy(&s5b); }