Commit 38d3248
Changed files (6)
src
01
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++) {
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;
+}
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
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;
+}
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);
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());
+}