diff --git a/assignment1/problem2/Makefile b/assignment1/problem2/Makefile new file mode 100644 index 0000000..033fd88 --- /dev/null +++ b/assignment1/problem2/Makefile @@ -0,0 +1,5 @@ +EXEC = validbrackets +SRC = $(wildcard *.c) + +$(EXEC): $(SRC) + gcc -o $@ $^ -Wall diff --git a/assignment1/problem2/stack.c b/assignment1/problem2/stack.c new file mode 100644 index 0000000..ea7126f --- /dev/null +++ b/assignment1/problem2/stack.c @@ -0,0 +1,108 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Assignment_1_problem_2 + * stack lib, allow to create empty stack + */ + +#include +#include +#include + +#include + +#include "stack.h" + +bool CreateStack(Stack *stack, int size) { + /* check, allow create empty stack */ + assert(size >= 0); + + /* memory allocate */ + stack->data = (char *)malloc(sizeof(char) * size); + if (stack->data == NULL) { + return false; + } + + /* init attribute */ + stack->top = -1; + stack->size = size; + + return true; +} + +bool IsEmpty(Stack *stack) { + /* if empty, stack->top = -1 */ + return stack->top < 0; +} + +bool IsFull(Stack *stack) { + /* if full, stack->top = stack->size */ + return stack->top >= stack->size; +} + +bool Top(Stack *stack, char *x) { + /* check empty */ + if (IsEmpty(stack)) { + return false; + } + + /* get top */ + *x = stack->data[stack->top]; + + return true; +} + +bool Push(Stack *stack, char x) { + /* check */ + if (IsFull(stack)) { + return false; + } + + /* push */ + stack->data[++stack->top] = x; + + return true; +} + +bool Pop(Stack *stack, char *x) { + /* check */ + if (IsEmpty(stack)) { + return false; + } + + /* get x, and top - 1 */ + *x = stack->data[stack->top--]; + return true; +} + +void DisplayStack(Stack *stack) { + char *top_p = stack->data + stack->top; + + /* print the top pointer hint */ + printf("top --> "); + + /* loop for stack data */ + for (; top_p >= stack->data; top_p--) { + + /* print top --> hint */ + if (top_p != stack->data + stack->top) { + printf(" "); + } + + printf("| %c |\n", *top_p); + } + + /* print top --> hint */ + if (top_p != stack->data + stack->top) { + printf(" "); + } + + printf("+--------------+\n"); +} + +void DestroyStack(Stack *stack) { + free(stack->data); + stack->data = NULL; + stack->size = 0; + stack->top = -1; +} diff --git a/assignment1/problem2/stack.h b/assignment1/problem2/stack.h new file mode 100644 index 0000000..2aa656b --- /dev/null +++ b/assignment1/problem2/stack.h @@ -0,0 +1,47 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Assignment_1_problem_2 + * allow to create empty stack + */ + +#ifndef MY_STACK +#define MY_STACK + +#include + +/* struct for stack */ +typedef struct Stack_str { + /* the size of stack */ + int size; + /* top index, empty is -1 */ + int top; + /* data */ + char *data; +} Stack; + +/* create an stack with size */ +bool CreateStack(Stack *stack, int size); + +/* check a stack whether it contains data */ +bool IsEmpty(Stack *stack); + +/* check full of stack */ +bool IsFull(Stack *stack); + +/* get the top value of a stack */ +bool Top(Stack *stack, char *x); + +/* add a value to stack */ +bool Push(Stack *stack, char x); + +/* delete a value from stack */ +bool Pop(Stack *stack, char *x); + +/* print the stack */ +void DisplayStack(Stack *stack); + +/* delete a stack */ +void DestroyStack(Stack *stack); + +#endif diff --git a/assignment1/problem2/test_main.c b/assignment1/problem2/test_main.c new file mode 100644 index 0000000..57c44ee --- /dev/null +++ b/assignment1/problem2/test_main.c @@ -0,0 +1,40 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Assignment_1_problem_2 + * Test function + */ + +#include +#include + +#include "validbrackets.h" + +/* test unit */ +typedef struct Unit_str { + char *text; + bool except; +} Unit; + +int main() { + + /* use for converting bool to string */ + static char *BOOL_TEXT[] = {"false", "true"}; + + Unit *test; + static Unit case1 = {"{()<()>}[]", true}; + static Unit case2 = {"(<)>", false}; + static Unit case3 = {"{()}[", false}; + static Unit case4 = {"", true}; + static Unit case5 = {NULL, false}; + + static char *HINT = "Test '%s', except: %s, result: %s\n"; + + test = &case1; printf(HINT, test->text, BOOL_TEXT[test->except], BOOL_TEXT[ValidBrackets(test->text)]); + test = &case2; printf(HINT, test->text, BOOL_TEXT[test->except], BOOL_TEXT[ValidBrackets(test->text)]); + test = &case3; printf(HINT, test->text, BOOL_TEXT[test->except], BOOL_TEXT[ValidBrackets(test->text)]); + test = &case4; printf(HINT, test->text, BOOL_TEXT[test->except], BOOL_TEXT[ValidBrackets(test->text)]); + test = &case5; printf(HINT, test->text, BOOL_TEXT[test->except], BOOL_TEXT[ValidBrackets(test->text)]); + + return 0; +} diff --git a/assignment1/problem2/validbrackets.c b/assignment1/problem2/validbrackets.c new file mode 100644 index 0000000..e7b173a --- /dev/null +++ b/assignment1/problem2/validbrackets.c @@ -0,0 +1,106 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Assignment_1_problem_2 + * validbrackets function + */ + +#include +#include + +#include "stack.h" +#include "validbrackets.h" + +/* all the left brackets */ +static char LEFTBRACKETS[] = "({[<"; + +/* all the right brackets */ +static char RIGHTBRACKETS[] = ")}]>"; + +/* number of brackets pairs */ +static int BRACKETS_LEN = 4; + +bool ValidBrackets(char *str) { + + /* if string pass all the test, will return default value 'true' */ + bool result = true; + + /* null pointer will return false */ + if (str == NULL) { + return false; + } + + /* tmp value to store the left brackets */ + char left; + + /* length of string */ + size_t str_len = strlen(str); + + Stack stack; + /* only half length of the string is enougth, + * empty stack is allowed */ + CreateStack(&stack, str_len/2); + + /* loop for all char in string */ + for (size_t i=0; i + +#include "stack.h" + +/* cvalid a string brackets, + * return true if empty string, + * return false if NULL string pointer */ +bool ValidBrackets(char *str); + +/* get the index number of left bracket, + * return -1 if c is not a left bracket */ +int IndexLeftBracket(char c); + +/* get the index number of right breacket, + * return -1 if c is not a left bracket */ +int IndexRightBracket(char c); + +/* compare two brackets if they match */ +bool MatchBracket(char left, char right); + +#endif