diff options
Diffstat (limited to 'src/01/01b/min_stack.c')
| -rw-r--r-- | src/01/01b/min_stack.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/01/01b/min_stack.c b/src/01/01b/min_stack.c new file mode 100644 index 0000000..adb96c8 --- /dev/null +++ b/src/01/01b/min_stack.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> +#include "min_stack.h" + +Stack *initialize() { + Stack *self = malloc(sizeof(Stack)); + self->head = NULL; + return self; +} + +int size(Stack *self) { + Node *current = self->head; + int i; + for (i = 0; current != NULL; i++) + current = current->next; + return i; +} + +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; +} + +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; + default: + node->next = *self; + *self = node; + break; + } +} + +void push(Stack *self, int data) { + if (self->head) + insert(&self->head, data); + else + self->head = new(data); +} + +int min(Stack *self) { + if (self && self->head) + return self->head->data; + + return (int)NULL; +} + +int pop(Stack *self) { + if (!self->head) + return (int)NULL; + + Node *current = self->head; + int data = current->data; + self->head = current->next; + current->next = NULL; + free(current); + return data; +} |
