assignment problem 2

This commit is contained in:
2021-03-28 22:21:46 +09:00
parent ae7899d4bf
commit c30b51ea6c
6 changed files with 337 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
EXEC = validbrackets
SRC = $(wildcard *.c)
$(EXEC): $(SRC)
gcc -o $@ $^ -Wall

View File

@@ -0,0 +1,108 @@
/*
* Author: Walter
* Student ID: 1930006025
* Assignment_1_problem_2
* stack lib, allow to create empty stack
*/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>
#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;
}

View File

@@ -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 <stdbool.h>
/* 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

View File

@@ -0,0 +1,40 @@
/*
* Author: Walter
* Student ID: 1930006025
* Assignment_1_problem_2
* Test function
*/
#include <stdio.h>
#include <stddef.h>
#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;
}

View File

@@ -0,0 +1,106 @@
/*
* Author: Walter
* Student ID: 1930006025
* Assignment_1_problem_2
* validbrackets function
*/
#include <stddef.h>
#include <string.h>
#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<str_len; i++) {
/* full stack means the string is not vailed */
if (IsFull(&stack)) {
result = false;
break;
}
/* if it is not left brackets will return -1 */
if (IndexLeftBracket(str[i]) != -1) {
/* store the left brackets in stack */
Push(&stack, str[i]);
} else {
/* check empty stack before pop from stack */
if (IsEmpty(&stack)) {
result = false;
break;
}
/* get the pair left brackets from stack */
Pop(&stack, &left);
/* check if the left and right brackets matched */
if (!MatchBracket(left, str[i])) {
result = false;
break;
}
}
}
/* if finally the stack is not empty, return falsle */
if (!(IsEmpty(&stack))) {
result = false;
}
/* no memory leak */
DestroyStack(&stack);
return result;
}
int IndexLeftBracket(char c) {
for (int i=0; i<BRACKETS_LEN; i++) {
if (c == LEFTBRACKETS[i]) {
return i;
}
}
/* if c is not left brackets, return -1 */
return -1;
}
int IndexRightBracket(char c) {
for (int i=0; i<BRACKETS_LEN; i++) {
if (c == RIGHTBRACKETS[i]) {
return i;
}
}
/* if c is not right brackets, return -1 */
return -1;
}
bool MatchBracket(char left, char right) {
/* check whether left and right brackets are matched */
return IndexLeftBracket(left) == IndexRightBracket(right);
}

View File

@@ -0,0 +1,31 @@
/*
* Author: Walter
* Student ID: 1930006025
* Assignment_1_problem_2
* validbrackets header files
*/
#ifndef VAILDBRACKETS
#define VAILDBRACKETS
#include <stdbool.h>
#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