diff options
| author | mo khan <mo.khan@gmail.com> | 2020-07-04 12:58:24 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-07-04 12:58:24 -0600 |
| commit | 38d32489872902eb094529edc2b0eab418d0a0c9 (patch) | |
| tree | bd1a35daf0dbf5a30c7febfd058850217f39ab29 /src/01 | |
| parent | 93acf977c7abd462899c68a7967378fc127e3b50 (diff) | |
Split main_stack.c
Diffstat (limited to 'src/01')
| -rw-r--r-- | src/01/01a/main.c | 1 | ||||
| -rw-r--r-- | src/01/01b/Makefile | 37 | ||||
| -rw-r--r-- | src/01/01b/main.c | 8 | ||||
| -rw-r--r-- | src/01/01b/min_stack.c | 72 | ||||
| -rw-r--r-- | src/01/01b/min_stack.h | 16 | ||||
| -rw-r--r-- | src/01/01b/min_stack_test.c | 89 |
6 files changed, 141 insertions, 82 deletions
diff --git a/src/01/01a/main.c b/src/01/01a/main.c index a5e9bfd..717469b 100644 --- a/src/01/01a/main.c +++ b/src/01/01a/main.c @@ -5,7 +5,6 @@ int main(int argc, char *argv[]) { printf("=== COMP-272 - Assignment 1 - Question 1a ===\n"); - printf("%lu\n", sizeof(int)); PriorityQueue *queue = initialize(); for (int i = 0; i < 10; i++) { diff --git a/src/01/01b/Makefile b/src/01/01b/Makefile new file mode 100644 index 0000000..8120d17 --- /dev/null +++ b/src/01/01b/Makefile @@ -0,0 +1,37 @@ +#!/usr/bin/make -f +SHELL=/bin/sh + +CC=clang +TEST_LIBS = -lcgreen + +BUILDDIR := build +OBJS := $(addprefix $(BUILDDIR)/,min_stack.o) +TEST_OBJS := $(addprefix $(BUILDDIR)/,min_stack_test.o) + +$(BUILDDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +.PHONY: all +all: $(OBJS) $(BUILDDIR)/main.o + $(CC) $(OBJS) $(BUILDDIR)/main.o -o $(BUILDDIR)/program + +.PHONY: test +test: $(OBJS) $(TEST_OBJS) + $(CC) $(OBJS) $(TEST_OBJS) $(TEST_LIBS) -o $(BUILDDIR)/test + +$(OBJS): | $(BUILDDIR) + +$(TEST_OBJS): | $(BUILDDIR) + +$(BUILDDIR): + mkdir $(BUILDDIR) + +.PHONY: clean +clean: + rm -fr build + +run : all + ./build/program + +run_test : test + cgreen-runner -c -v $(BUILDDIR)/test diff --git a/src/01/01b/main.c b/src/01/01b/main.c new file mode 100644 index 0000000..f90e37f --- /dev/null +++ b/src/01/01b/main.c @@ -0,0 +1,8 @@ +#include <stdio.h> +#include <stdlib.h> + +int main(int argc, char *argv[]) +{ + printf("=== COMP-272 - Assignment 1 - Question 1b ===\n"); + return 0; +} 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; +} diff --git a/src/01/01b/min_stack.h b/src/01/01b/min_stack.h new file mode 100644 index 0000000..e75c2d7 --- /dev/null +++ b/src/01/01b/min_stack.h @@ -0,0 +1,16 @@ +struct node { + int data; + struct node *next; +}; + +typedef struct node Node; + +typedef struct { + Node *head; +} Stack; + +Stack *initialize(); +int size(Stack *self); +void push(Stack *self, int data); +int min(Stack *self); +int pop(Stack *self); diff --git a/src/01/01b/min_stack_test.c b/src/01/01b/min_stack_test.c index 383ae62..77fb391 100644 --- a/src/01/01b/min_stack_test.c +++ b/src/01/01b/min_stack_test.c @@ -1,4 +1,5 @@ #include <cgreen/cgreen.h> +#include "min_stack.h" /* Design and implement a `MinStack` data structure that can store @@ -9,92 +10,12 @@ * `size()` * `min()` All operations should run in constant time. - */ +*/ Describe(MinStack); BeforeEach(MinStack){ } AfterEach(MinStack){ } -struct node { - int data; - struct node *next; -}; - -typedef struct node Node; - -typedef struct { - Node *head; -} Stack; - -static Stack *initialize() { - Stack *self = malloc(sizeof(Stack)); - self->head = NULL; - return self; -} - -static 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; - } -} - -static void push(Stack *self, int data) { - if (self->head) - insert(&self->head, data); - else - self->head = new(data); -} - -static int min(Stack *self) { - if (self && self->head) - return self->head->data; - - return (int)NULL; -} - -static 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; -} - Ensure(MinStack, when_empty) { Stack *stack = initialize(); @@ -169,3 +90,9 @@ TestSuite *min_stack_tests() { add_test_with_context(suite, MinStack, when_pushing_multiple_integers_out_of_order); return suite; } + +int main(int argc, char **argv) { + TestSuite *suite = create_test_suite(); + add_suite(suite, min_stack_tests()); + return run_test_suite(suite, create_text_reporter()); +} |
