diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ea464c..6078154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,13 @@ cmake_minimum_required(VERSION 3.25) -project(sorting_station C) +project(C_homework C) +add_compile_options(-Wall -Wextra -pedantic) +# Libraries add_library(stack src/stack_and_queue/stack/stack.c) +# Executables and links with libraries +add_executable(advanced_bracket_balance src/stack_and_queue/stack/advanced_bracket_balance.c) +target_link_libraries(advanced_bracket_balance PRIVATE stack) + add_executable(sorting_station src/stack_and_queue/stack/sorting_station.c) target_link_libraries(sorting_station PRIVATE stack) -target_compile_options(sorting_station PRIVATE -Wall -Wextra -pedantic) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c new file mode 100644 index 0000000..8203078 --- /dev/null +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -0,0 +1,71 @@ +#include "stack.h" +#include +#include +#include +#include + +bool isOpeningBracket(char c) +{ + return (c == '(' || c == '[' || c == '{'); +} + +bool isClosingBracket(char c) +{ + return (c == ')' || c == ']' || c == '}'); +} + +// Checks brackets balance. +// Returns true if brackets balanced and false if not. +// Takes string. +bool isBracketsBalanced(char* string) +{ + int size = strlen(string); + Stack* brackets = newStack(); + + for (int i = 0; i < size; i++) { + if (isOpeningBracket(string[i])) { + push(brackets, string[i]); + } + if (isClosingBracket(string[i])) { + if (isEmpty(brackets)) { + deleteStack(brackets); + return false; + } + + bool isClosed = false; + switch (pop(brackets)) { + case '(': + isClosed = string[i] == ')'; + break; + case '[': + isClosed = string[i] == ']'; + break; + case '{': + isClosed = string[i] == '}'; + break; + } + + if (!isClosed) { + deleteStack(brackets); + return false; + } + } + } + + bool isAllClosed = isEmpty(brackets); + deleteStack(brackets); + return isAllClosed; +} + +int main() +{ + assert(isBracketsBalanced("T(e){s}[t]") && "Test failed."); + assert(isBracketsBalanced("123") && "Test failed."); + assert(isBracketsBalanced("") && "Test failed."); + assert(!isBracketsBalanced("(") && "Test failed."); + assert(!isBracketsBalanced("({a)}") && "Test failed."); + assert(isBracketsBalanced("((({{{[[[]]]}}})))") && "Test failed."); + printf("All tests successfully passed.\n"); + + return 0; +}