From 345bc50da4bd95691dfc61981e264e969c33a881 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 14 Oct 2025 20:23:21 +0300 Subject: [PATCH 01/32] Add stack library header file --- src/stack_and_queue/stack/stack.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/stack_and_queue/stack/stack.h diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h new file mode 100644 index 0000000..0822bbf --- /dev/null +++ b/src/stack_and_queue/stack/stack.h @@ -0,0 +1,30 @@ +#pragma once + +typedef struct StackNode { + int value; + struct StackNode* next; +} StackNode; + +typedef struct Stack { + StackNode* head; +} Stack; + +// Creates new stack. +// Returns pointer on the created stack. +Stack* newStack(); + +// Deletes stack. +// Takes pointer on the stack. +void deleteStack(Stack* stack); + +// Pushes new value on the top of the stack. +// Takes pointer on the stack and value for push. +void push(Stack* stack, int value); + +// Deletes the top value of the stack and returns it. +// Takes pointer on the stack. +int pop(Stack* stack); + +// Prints the top value of the stack. +// Takes pointer on the stack. +void peek(Stack* stack); From 4737d32eed5973489422ffb1074afc99a74a9abe Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 14 Oct 2025 20:23:52 +0300 Subject: [PATCH 02/32] Add stack library realisation file --- src/stack_and_queue/stack/stack.c | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/stack_and_queue/stack/stack.c diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c new file mode 100644 index 0000000..e61ca28 --- /dev/null +++ b/src/stack_and_queue/stack/stack.c @@ -0,0 +1,54 @@ +#include "stack.h" + +#include +#include + +Stack* newStack() +{ + Stack* stack = malloc(sizeof(Stack)); + stack->head = NULL; + return stack; +} + +void deleteStack(Stack* stack) +{ + StackNode* highest = stack->head; + while (highest != NULL) { + StackNode* newHighest = highest->next; + free(highest); + highest = newHighest; + } + free(stack); +} + +void push(Stack* stack, int value) +{ + StackNode* newNode = malloc(sizeof(StackNode)); + newNode->value = value; + newNode->next = stack->head; + stack->head = newNode; +} + +int pop(Stack* stack) +{ + if (stack->head == NULL) { + printf("The stack is empty. \n"); + return -1; + } + + StackNode* poppedNode = stack->head; + int value = poppedNode->value; + stack->head = poppedNode->next; + free(poppedNode); + return value; +} + +void peek(Stack* stack) +{ + if (stack->head == NULL) { + printf("The stack is empty. \n"); + return; + } + + printf("The highest element: %d \n", stack->head->value); +} From 405bf4c1c824f79f37d9c5bb3d1867adb39a2e66 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 14 Oct 2025 20:49:07 +0300 Subject: [PATCH 03/32] Update stack header file commentaries --- src/stack_and_queue/stack/stack.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index 0822bbf..cbbfc15 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -23,8 +23,10 @@ void push(Stack* stack, int value); // Deletes the top value of the stack and returns it. // Takes pointer on the stack. +// If the stack is empty returns -1. int pop(Stack* stack); // Prints the top value of the stack. // Takes pointer on the stack. +// Prints message if the stack is empty. void peek(Stack* stack); From ce89c997bf05d3bf5641b96e76c43c96e38cc9ad Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 14 Oct 2025 20:49:36 +0300 Subject: [PATCH 04/32] Update stack realisation file --- src/stack_and_queue/stack/stack.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c index e61ca28..c745db1 100644 --- a/src/stack_and_queue/stack/stack.c +++ b/src/stack_and_queue/stack/stack.c @@ -32,7 +32,6 @@ void push(Stack* stack, int value) int pop(Stack* stack) { if (stack->head == NULL) { - printf("The stack is empty. \n"); return -1; } From f4d1e691c16db183d8f85ce3a3c8b5f183c4a9ff Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Mon, 20 Oct 2025 14:59:09 +0300 Subject: [PATCH 05/32] Update stack realisation file --- src/stack_and_queue/stack/stack.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c index c745db1..3b2b2c2 100644 --- a/src/stack_and_queue/stack/stack.c +++ b/src/stack_and_queue/stack/stack.c @@ -3,9 +3,18 @@ #include #include +typedef struct StackNode { + int value; + struct StackNode* next; +} StackNode; + +typedef struct Stack { + StackNode* head; +} Stack; + Stack* newStack() { - Stack* stack = malloc(sizeof(Stack)); + Stack* stack = malloc(sizeof(*stack)); stack->head = NULL; return stack; } @@ -23,7 +32,7 @@ void deleteStack(Stack* stack) void push(Stack* stack, int value) { - StackNode* newNode = malloc(sizeof(StackNode)); + StackNode* newNode = malloc(sizeof(*newNode)); newNode->value = value; newNode->next = stack->head; stack->head = newNode; @@ -42,12 +51,11 @@ int pop(Stack* stack) return value; } -void peek(Stack* stack) +int peek(Stack* stack) { if (stack->head == NULL) { - printf("The stack is empty. \n"); - return; + return -1; } - printf("The highest element: %d \n", stack->head->value); + return stack->head->value; } From d389c7db73352e9106299573aedd4817a7017bd2 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Mon, 20 Oct 2025 15:00:04 +0300 Subject: [PATCH 06/32] Update stack header file --- src/stack_and_queue/stack/stack.h | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index cbbfc15..b0a355f 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -1,13 +1,8 @@ #pragma once -typedef struct StackNode { - int value; - struct StackNode* next; -} StackNode; +typedef struct StackNode StackNode; -typedef struct Stack { - StackNode* head; -} Stack; +typedef struct Stack Stack; // Creates new stack. // Returns pointer on the created stack. @@ -26,7 +21,7 @@ void push(Stack* stack, int value); // If the stack is empty returns -1. int pop(Stack* stack); -// Prints the top value of the stack. +// Returns the top value of the stack. // Takes pointer on the stack. -// Prints message if the stack is empty. -void peek(Stack* stack); +// If the stack is empty returns -1. +int peek(Stack* stack); From ceeeb02df60f409dd711964c0f065f73ac0447b5 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 19:58:39 +0300 Subject: [PATCH 07/32] Update stack header file --- src/stack_and_queue/stack/stack.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index b0a355f..4439245 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -1,5 +1,7 @@ #pragma once +#include + typedef struct StackNode StackNode; typedef struct Stack Stack; @@ -8,7 +10,7 @@ typedef struct Stack Stack; // Returns pointer on the created stack. Stack* newStack(); -// Deletes stack. +// Deletes stack. Frees all memory used in it. // Takes pointer on the stack. void deleteStack(Stack* stack); @@ -16,7 +18,7 @@ void deleteStack(Stack* stack); // Takes pointer on the stack and value for push. void push(Stack* stack, int value); -// Deletes the top value of the stack and returns it. +// Deletes the top value of the stack and returns it. Frees memory used for top node. // Takes pointer on the stack. // If the stack is empty returns -1. int pop(Stack* stack); @@ -25,3 +27,7 @@ int pop(Stack* stack); // Takes pointer on the stack. // If the stack is empty returns -1. int peek(Stack* stack); + +// Returns true if the stack is empty and false if not. +// Takes pointer on the stack. +bool isEmpty(Stack* stack); From f344512d86c6205ed189fc76e409be20f046ad8d Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 19:59:13 +0300 Subject: [PATCH 08/32] Update stack realisation file --- src/stack_and_queue/stack/stack.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c index 3b2b2c2..ff1989f 100644 --- a/src/stack_and_queue/stack/stack.c +++ b/src/stack_and_queue/stack/stack.c @@ -1,5 +1,6 @@ #include "stack.h" +#include #include #include @@ -21,11 +22,8 @@ Stack* newStack() void deleteStack(Stack* stack) { - StackNode* highest = stack->head; - while (highest != NULL) { - StackNode* newHighest = highest->next; - free(highest); - highest = newHighest; + while (stack->head != NULL) { + pop(stack); } free(stack); } @@ -40,7 +38,7 @@ void push(Stack* stack, int value) int pop(Stack* stack) { - if (stack->head == NULL) { + if (isEmpty(stack)) { return -1; } @@ -53,9 +51,14 @@ int pop(Stack* stack) int peek(Stack* stack) { - if (stack->head == NULL) { + if (isEmpty(stack)) { return -1; } return stack->head->value; } + +bool isEmpty(Stack* stack) +{ + return stack->head == NULL; +} From caa1bf95e1910f6be4efd5797263ddf2c071bbc5 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 20:13:52 +0300 Subject: [PATCH 09/32] Update stack header file --- src/stack_and_queue/stack/stack.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index 4439245..536c186 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -2,8 +2,6 @@ #include -typedef struct StackNode StackNode; - typedef struct Stack Stack; // Creates new stack. From 0d99e196eefce8fde90f718f2f5037ca77dc654d Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 20:14:07 +0300 Subject: [PATCH 10/32] Update stack realisation file --- src/stack_and_queue/stack/stack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c index ff1989f..7dfb49a 100644 --- a/src/stack_and_queue/stack/stack.c +++ b/src/stack_and_queue/stack/stack.c @@ -9,9 +9,9 @@ typedef struct StackNode { struct StackNode* next; } StackNode; -typedef struct Stack { +struct Stack { StackNode* head; -} Stack; +}; Stack* newStack() { From 7f111b6a933814c20330843e9efd0d0241831585 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 14 Oct 2025 23:04:07 +0300 Subject: [PATCH 11/32] Add advanced bracket balance homework --- .../stack/advanced_bracket_balance.c | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/stack_and_queue/stack/advanced_bracket_balance.c 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..86a3e65 --- /dev/null +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -0,0 +1,80 @@ +#include "stack.h" +#include +#include + +bool isBracket(char c) +{ + if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { + return true; + } + return false; +} + +// Saves opening brackets in stack. Deletes pairs. +// Takes bracket symbol and pointer on the bracket stack. +// Returns true if brackets closes right or opens. Else returns false. +bool bracketProcessing(char bracket, Stack* bracketStack) +{ + if (bracket == '(') { + push(bracketStack, 1); + } + if (bracket == '[') { + push(bracketStack, 2); + } + if (bracket == '{') { + push(bracketStack, 3); + } + if (bracket == ')') { + if (pop(bracketStack) != 1) { + return false; + } + } + if (bracket == ']') { + if (pop(bracketStack) != 2) { + return false; + } + } + if (bracket == '}') { + if (pop(bracketStack) != 3) { + return false; + } + } + return true; +} + +int main() +{ + int size = 0; + printf("Input size of string: "); + scanf("%d", &size); + + Stack* bracketStack = newStack(); + char currentChar = 0; + // Костыль для избавления от символа переноса строки после ввода размера. + scanf("%c", ¤tChar); + bool isBalanced = true; + printf("Input string: "); + for (int i = 0; i < size; i++) { + scanf("%c", ¤tChar); + if (isBracket(currentChar)) { + isBalanced = bracketProcessing(currentChar, bracketStack); + if (!isBalanced) { + break; + } + } + } + // Проверка, что не осталось незакрытых скобок. + if (pop(bracketStack) != -1) { + isBalanced = false; + } + + if (isBalanced) { + printf("Brackets balanced. \n"); + } else { + printf("Brackets not balanced. \n"); + } + + deleteStack(bracketStack); + + return 0; +} From f70cccdd4bd1e4cf087d8a09b397c29b49cc2f9e Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 16 Oct 2025 14:48:44 +0300 Subject: [PATCH 12/32] Update advanced bracket balance homework --- .../stack/advanced_bracket_balance.c | 117 +++++++++--------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 86a3e65..77a2ce9 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -1,80 +1,79 @@ #include "stack.h" #include #include +#include bool isBracket(char c) { - if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { - return true; - } - return false; + return (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}'); } -// Saves opening brackets in stack. Deletes pairs. -// Takes bracket symbol and pointer on the bracket stack. -// Returns true if brackets closes right or opens. Else returns false. -bool bracketProcessing(char bracket, Stack* bracketStack) +// Checks brackets balance. +// Returns true if brackets balanced and false if not. +// Takes string. +bool isBracketsBalanced(char* string) { - if (bracket == '(') { - push(bracketStack, 1); - } - if (bracket == '[') { - push(bracketStack, 2); - } - if (bracket == '{') { - push(bracketStack, 3); - } - if (bracket == ')') { - if (pop(bracketStack) != 1) { - return false; - } - } - if (bracket == ']') { - if (pop(bracketStack) != 2) { - return false; + int size = strlen(string); + Stack* brackets = newStack(); + + for (int i = 0; i < size; i++) { + // If char is opening bracket, pushes individual for all bracket types number in the stack. + // If char is closing bracket, pops number from the stack. If number is not right, returns false. + if (isBracket(string[i])) { + if (string[i] == '(') { + push(brackets, 1); + } + if (string[i] == '[') { + push(brackets, 2); + } + if (string[i] == '{') { + push(brackets, 3); + } + if (string[i] == ')') { + if (pop(brackets) != 1) { + deleteStack(brackets); + return false; + } + } + if (string[i] == ']') { + if (pop(brackets) != 2) { + deleteStack(brackets); + return false; + } + } + if (string[i] == '}') { + if (pop(brackets) != 3) { + deleteStack(brackets); + return false; + } + } } } - if (bracket == '}') { - if (pop(bracketStack) != 3) { - return false; - } + // Check for all brackets closed. + if (pop(brackets) != -1) { + deleteStack(brackets); + return false; } + + deleteStack(brackets); return true; } int main() { - int size = 0; - printf("Input size of string: "); - scanf("%d", &size); - - Stack* bracketStack = newStack(); - char currentChar = 0; - // Костыль для избавления от символа переноса строки после ввода размера. - scanf("%c", ¤tChar); - bool isBalanced = true; - printf("Input string: "); - for (int i = 0; i < size; i++) { - scanf("%c", ¤tChar); - if (isBracket(currentChar)) { - isBalanced = bracketProcessing(currentChar, bracketStack); - if (!isBalanced) { - break; - } - } - } - // Проверка, что не осталось незакрытых скобок. - if (pop(bracketStack) != -1) { - isBalanced = false; - } - - if (isBalanced) { - printf("Brackets balanced. \n"); - } else { - printf("Brackets not balanced. \n"); - } + char a[] = "T(e){s}[t]"; + char b[] = "123"; + char c[] = ""; + char d[] = "("; + char e[] = "({a)}"; + char f[] = "((({{{[[[]]]}}})))"; - deleteStack(bracketStack); + printf("%s - %d\n", a, isBracketsBalanced(a)); + printf("%s - %d\n", b, isBracketsBalanced(b)); + printf("%s - %d\n", c, isBracketsBalanced(c)); + printf("%s - %d\n", d, isBracketsBalanced(d)); + printf("%s - %d\n", e, isBracketsBalanced(e)); + printf("%s - %d\n", f, isBracketsBalanced(f)); return 0; } From a64578d6795a98eb4de8322b3991081c3343dcc9 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 20:09:03 +0300 Subject: [PATCH 13/32] Update bracket balance checker --- src/stack_and_queue/stack/advanced_bracket_balance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 77a2ce9..82eca38 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -50,7 +50,7 @@ bool isBracketsBalanced(char* string) } } // Check for all brackets closed. - if (pop(brackets) != -1) { + if (isEmpty(brackets)) { deleteStack(brackets); return false; } From 0af264a34539a7f302442aeb1b94586502565835 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 21 Oct 2025 20:20:56 +0300 Subject: [PATCH 14/32] Update bracket balance checker --- src/stack_and_queue/stack/advanced_bracket_balance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 82eca38..4ea2006 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -50,7 +50,7 @@ bool isBracketsBalanced(char* string) } } // Check for all brackets closed. - if (isEmpty(brackets)) { + if (!isEmpty(brackets)) { deleteStack(brackets); return false; } From 41b1bd6736d82be3b3d4eafc24e93617ba2fe5c0 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Wed, 22 Oct 2025 20:51:42 +0300 Subject: [PATCH 15/32] Add compile instruction for advanced bracket balance --- src/stack_and_queue/stack/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/stack_and_queue/stack/README.md diff --git a/src/stack_and_queue/stack/README.md b/src/stack_and_queue/stack/README.md new file mode 100644 index 0000000..1ba0686 --- /dev/null +++ b/src/stack_and_queue/stack/README.md @@ -0,0 +1,4 @@ +## Compile inctruction for advanced brackets balance +gcc -Wall -Wextra -pedantic -O2 stack.c -c + +gcc -Wall -Wextra -pedantic -O2 stack.o advanced_bracket_balance.c From 3dea46b86f7a5ddac492b076929fe6723189ff59 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sun, 9 Nov 2025 00:05:20 +0300 Subject: [PATCH 16/32] Update .gitignore with adding ignoring CMake build directory --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index b48d248..b1e499b 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,7 @@ Module.symvers Mkfile.old dkms.conf +# CMake +build + # End of https://www.toptal.com/developers/gitignore/api/c From d73f226079b7c651274ab1778cf1f5efad68254c Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sun, 9 Nov 2025 00:06:26 +0300 Subject: [PATCH 17/32] Add CMakeLists.txt for build advanced bracket balance --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bfed53f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.25) +project(advanced_bracket_balance C) + +add_library(stack src/stack_and_queue/stack/stack.c) + +add_executable(advanced_bracket_balance src/stack_and_queue/stack/advanced_bracket_balance.c) +target_link_libraries(advanced_bracket_balance PRIVATE stack) +target_compile_options(advanced_bracket_balance PRIVATE -Wall -Wextra -pedantic) From ca828c10c04d088f420644ece4e7fa91addb3591 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sun, 9 Nov 2025 00:06:58 +0300 Subject: [PATCH 18/32] Update instructions how to build --- src/stack_and_queue/stack/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/stack_and_queue/stack/README.md b/src/stack_and_queue/stack/README.md index 1ba0686..b35bd8e 100644 --- a/src/stack_and_queue/stack/README.md +++ b/src/stack_and_queue/stack/README.md @@ -1,4 +1,3 @@ ## Compile inctruction for advanced brackets balance -gcc -Wall -Wextra -pedantic -O2 stack.c -c - -gcc -Wall -Wextra -pedantic -O2 stack.o advanced_bracket_balance.c +cmake . -B build\ +cmake --build build From bce5889ea2333e7120d2cb55407ae9650783c04a Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 14:41:54 +0300 Subject: [PATCH 19/32] Update stack realization Remove pop and peek -1 return if stack is empty. Add asserts for memory allocation. Add asserts for not empty stack in pop and peek. --- src/stack_and_queue/stack/stack.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/stack_and_queue/stack/stack.c b/src/stack_and_queue/stack/stack.c index 7dfb49a..2878e96 100644 --- a/src/stack_and_queue/stack/stack.c +++ b/src/stack_and_queue/stack/stack.c @@ -1,5 +1,6 @@ #include "stack.h" +#include #include #include #include @@ -15,14 +16,14 @@ struct Stack { Stack* newStack() { - Stack* stack = malloc(sizeof(*stack)); - stack->head = NULL; + Stack* stack = calloc(1, sizeof(*stack)); + assert(stack != NULL && "Error! Memory allocated incorrect."); return stack; } void deleteStack(Stack* stack) { - while (stack->head != NULL) { + while (!isEmpty(stack)) { pop(stack); } free(stack); @@ -31,6 +32,7 @@ void deleteStack(Stack* stack) void push(Stack* stack, int value) { StackNode* newNode = malloc(sizeof(*newNode)); + assert(newNode != NULL && "Error! Memory allocated incorrect."); newNode->value = value; newNode->next = stack->head; stack->head = newNode; @@ -38,10 +40,7 @@ void push(Stack* stack, int value) int pop(Stack* stack) { - if (isEmpty(stack)) { - return -1; - } - + assert(!isEmpty(stack) && "Error! Stack is empty. Can`t pop value."); StackNode* poppedNode = stack->head; int value = poppedNode->value; stack->head = poppedNode->next; @@ -51,10 +50,7 @@ int pop(Stack* stack) int peek(Stack* stack) { - if (isEmpty(stack)) { - return -1; - } - + assert(!isEmpty(stack) && "Error! Stack is empty. Can`t peek value."); return stack->head->value; } From 2526fa56f9ffe725c3ad3d5ea577af2931fcaf1d Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 14:45:32 +0300 Subject: [PATCH 20/32] Update stack header documentation --- src/stack_and_queue/stack/stack.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index 536c186..4a65d1e 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -17,6 +17,7 @@ void deleteStack(Stack* stack); void push(Stack* stack, int value); // Deletes the top value of the stack and returns it. Frees memory used for top node. +<<<<<<< HEAD // Takes pointer on the stack. // If the stack is empty returns -1. int pop(Stack* stack); @@ -24,6 +25,17 @@ int pop(Stack* stack); // Returns the top value of the stack. // Takes pointer on the stack. // If the stack is empty returns -1. +======= +// Takes pointer to the stack. +// Don`t use if the stack is empty. It causes the error. +// Check this with isEmpty before use this function. +int pop(Stack* stack); + +// Returns the top value of the stack. +// Takes pointer to the stack. +// Don`t use if the stack is empty. It causes the error. +// Check this with isEmpty before use this function. +>>>>>>> cce4851 (Update stack header documentation) int peek(Stack* stack); // Returns true if the stack is empty and false if not. From 8e759a774e4c126238561e9f7cc8db37d5031498 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 14:50:28 +0300 Subject: [PATCH 21/32] Update stack header documentation --- src/stack_and_queue/stack/stack.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/stack_and_queue/stack/stack.h b/src/stack_and_queue/stack/stack.h index 4a65d1e..0b2329d 100644 --- a/src/stack_and_queue/stack/stack.h +++ b/src/stack_and_queue/stack/stack.h @@ -17,15 +17,6 @@ void deleteStack(Stack* stack); void push(Stack* stack, int value); // Deletes the top value of the stack and returns it. Frees memory used for top node. -<<<<<<< HEAD -// Takes pointer on the stack. -// If the stack is empty returns -1. -int pop(Stack* stack); - -// Returns the top value of the stack. -// Takes pointer on the stack. -// If the stack is empty returns -1. -======= // Takes pointer to the stack. // Don`t use if the stack is empty. It causes the error. // Check this with isEmpty before use this function. @@ -35,7 +26,6 @@ int pop(Stack* stack); // Takes pointer to the stack. // Don`t use if the stack is empty. It causes the error. // Check this with isEmpty before use this function. ->>>>>>> cce4851 (Update stack header documentation) int peek(Stack* stack); // Returns true if the stack is empty and false if not. From b24330907c769885612b64096334efec447ce63a Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 18:38:20 +0300 Subject: [PATCH 22/32] Update advanced bracket balance checker --- .../stack/advanced_bracket_balance.c | 80 +++++++++---------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 4ea2006..4d01a03 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -1,11 +1,17 @@ #include "stack.h" +#include #include #include #include -bool isBracket(char c) +bool isOpeningBracket(char c) { - return (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}'); + return (c == '(' || c == '[' || c == '{'); +} + +bool isClosingBracket(char c) +{ + return (c == ')' || c == ']' || c == '}'); } // Checks brackets balance. @@ -17,39 +23,33 @@ bool isBracketsBalanced(char* string) Stack* brackets = newStack(); for (int i = 0; i < size; i++) { - // If char is opening bracket, pushes individual for all bracket types number in the stack. - // If char is closing bracket, pops number from the stack. If number is not right, returns false. - if (isBracket(string[i])) { - if (string[i] == '(') { - push(brackets, 1); - } - if (string[i] == '[') { - push(brackets, 2); - } - if (string[i] == '{') { - push(brackets, 3); - } - if (string[i] == ')') { - if (pop(brackets) != 1) { - deleteStack(brackets); - return false; - } + if (isOpeningBracket(string[i])) { + push(brackets, string[i]); + } + if (isClosingBracket(string[i])) { + if (isEmpty(brackets)) { + return false; } - if (string[i] == ']') { - if (pop(brackets) != 2) { - 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 (string[i] == '}') { - if (pop(brackets) != 3) { - deleteStack(brackets); - return false; - } + + if (!isClosed) { + return false; } } } - // Check for all brackets closed. + // Check for unclosed brackets. if (!isEmpty(brackets)) { deleteStack(brackets); return false; @@ -61,19 +61,13 @@ bool isBracketsBalanced(char* string) int main() { - char a[] = "T(e){s}[t]"; - char b[] = "123"; - char c[] = ""; - char d[] = "("; - char e[] = "({a)}"; - char f[] = "((({{{[[[]]]}}})))"; - - printf("%s - %d\n", a, isBracketsBalanced(a)); - printf("%s - %d\n", b, isBracketsBalanced(b)); - printf("%s - %d\n", c, isBracketsBalanced(c)); - printf("%s - %d\n", d, isBracketsBalanced(d)); - printf("%s - %d\n", e, isBracketsBalanced(e)); - printf("%s - %d\n", f, isBracketsBalanced(f)); + 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; } From 1488ca09780c16e34a46e9a1031fd7a4b27a8c0c Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 18:44:52 +0300 Subject: [PATCH 23/32] Delete build instruction from stack folder --- src/stack_and_queue/stack/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 src/stack_and_queue/stack/README.md diff --git a/src/stack_and_queue/stack/README.md b/src/stack_and_queue/stack/README.md deleted file mode 100644 index b35bd8e..0000000 --- a/src/stack_and_queue/stack/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Compile inctruction for advanced brackets balance -cmake . -B build\ -cmake --build build From 6b648f444508d53c066b3cdbae64a712b4b9020d Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 18:58:53 +0300 Subject: [PATCH 24/32] Add build instruction in README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 8d586e5..ab05d77 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,9 @@ Основная почта: nicholas.shestakov@gmail.com Телеграм: @Kolya_shesterka + +## Инструкции по сборке: +```console +$ cmake . -B build +$ cmake --build build +``` From 96bb8d611155304f90ede6ef30d619a7cb613c99 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Wed, 22 Oct 2025 20:47:46 +0300 Subject: [PATCH 25/32] Add sorting station algorithm --- src/stack_and_queue/stack/sorting_station.c | 95 +++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/stack_and_queue/stack/sorting_station.c diff --git a/src/stack_and_queue/stack/sorting_station.c b/src/stack_and_queue/stack/sorting_station.c new file mode 100644 index 0000000..2f7872d --- /dev/null +++ b/src/stack_and_queue/stack/sorting_station.c @@ -0,0 +1,95 @@ +#include "stack.h" +#include +#include +#include +#include +#include + +bool isOperatorFirstPriority(char c) +{ + return c == '*' || c == '/'; +} + +bool isOperatorSecondPriority(char c) +{ + return c == '+' || c == '-'; +} + +// Takes infix form of expression as string and returns pointer on postfix form string. +char* sortingStation(char* infixForm) +{ + char* output = calloc(strlen(infixForm), sizeof(output) + 1); + Stack* operators = newStack(); + + int indexOfOutput = 0; + for (int indexOfInfix = 0; infixForm[indexOfInfix] != '\0'; ++indexOfInfix) { + if (isdigit(infixForm[indexOfInfix])) { + output[indexOfOutput] = infixForm[indexOfInfix]; + output[indexOfOutput + 1] = ' '; + indexOfOutput += 2; + } + if (isOperatorFirstPriority(infixForm[indexOfInfix]) || infixForm[indexOfInfix] == '(') { + push(operators, infixForm[indexOfInfix]); + } + if (isOperatorSecondPriority(infixForm[indexOfInfix])) { + while (!isEmpty(operators) && peek(operators) != '(') { + output[indexOfOutput] = pop(operators); + output[indexOfOutput + 1] = ' '; + indexOfOutput += 2; + } + push(operators, infixForm[indexOfInfix]); + } + if (infixForm[indexOfInfix] == ')') { + while (peek(operators) != '(') { + output[indexOfOutput] = pop(operators); + output[indexOfOutput + 1] = ' '; + indexOfOutput += 2; + } + pop(operators); + } + } + + while (!isEmpty(operators)) { + output[indexOfOutput] = pop(operators); + output[indexOfOutput + 1] = ' '; + indexOfOutput += 2; + } + + deleteStack(operators); + return output; +} + +int main() +{ + char* input1 = "(1 + 1) * 2"; + char* output1 = sortingStation(input1); + char* input2 = "4/2+6"; + char* output2 = sortingStation(input2); + char* input3 = "((1 + 2) * 3) - 4"; + char* output3 = sortingStation(input3); + char* input4 = "((((1))))"; + char* output4 = sortingStation(input4); + char* input5 = "(1 + (4 + 5 + 2) - 3) + (6 + 8)"; + char* output5 = sortingStation(input5); + char* input6 = "1"; + char* output6 = sortingStation(input6); + char* input7 = ""; + char* output7 = sortingStation(input7); + + printf("%s -> %s\n", input1, output1); + printf("%s -> %s\n", input2, output2); + printf("%s -> %s\n", input3, output3); + printf("%s -> %s\n", input4, output4); + printf("%s -> %s\n", input5, output5); + printf("%s -> %s\n", input6, output6); + printf("%s -> %s\n", input7, output7); + + free(output1); + free(output2); + free(output3); + free(output4); + free(output5); + free(output6); + free(output7); + return 0; +} From b0d02b7d0d87afc59e432346998771d101a96d2c Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Wed, 22 Oct 2025 20:48:27 +0300 Subject: [PATCH 26/32] Add compile instruction for sorting station --- src/stack_and_queue/stack/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/stack_and_queue/stack/README.md diff --git a/src/stack_and_queue/stack/README.md b/src/stack_and_queue/stack/README.md new file mode 100644 index 0000000..5a16c22 --- /dev/null +++ b/src/stack_and_queue/stack/README.md @@ -0,0 +1,4 @@ +## Compile instruction for sorting station +gcc -Wall -Wextra -pedantic -O2 stack.c -c + +gcc -Wall -Wextra -pedantic -O2 stack.o sorting_station.c From 7f7b0cd406a2a73397cf7b03f9b63119fcbaa78f Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sun, 9 Nov 2025 00:12:37 +0300 Subject: [PATCH 27/32] Add CMakeLists.txt for build sorting station --- CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bfed53f..5d6d3d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,15 @@ cmake_minimum_required(VERSION 3.25) -project(advanced_bracket_balance C) +project(C_homework C) +# 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) -target_compile_options(advanced_bracket_balance PRIVATE -Wall -Wextra -pedantic) + +add_executable(sorting_station src/stack_and_queue/stack/sorting_station.c) +target_link_libraries(sorting_station PRIVATE stack) + + +target_compile_options(all_executables PUBLIC -Wall -Wextra -pedantic) From e236b6c5269d3167aff3a0bad5664984c5146d07 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 16 Dec 2025 16:31:20 +0300 Subject: [PATCH 28/32] Add compile flags for all executables --- CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d6d3d0..6078154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.25) project(C_homework C) +add_compile_options(-Wall -Wextra -pedantic) # Libraries add_library(stack src/stack_and_queue/stack/stack.c) @@ -10,6 +11,3 @@ 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(all_executables PUBLIC -Wall -Wextra -pedantic) From 7bbf2c1351aa96464118001f0887759347d5e5eb Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 11 Dec 2025 22:04:09 +0300 Subject: [PATCH 29/32] Update sorting station Add error messages for incorrect infix forms. --- src/stack_and_queue/stack/sorting_station.c | 149 ++++++++++++++------ 1 file changed, 105 insertions(+), 44 deletions(-) diff --git a/src/stack_and_queue/stack/sorting_station.c b/src/stack_and_queue/stack/sorting_station.c index 2f7872d..594698b 100644 --- a/src/stack_and_queue/stack/sorting_station.c +++ b/src/stack_and_queue/stack/sorting_station.c @@ -1,4 +1,5 @@ #include "stack.h" +#include #include #include #include @@ -15,44 +16,97 @@ bool isOperatorSecondPriority(char c) return c == '+' || c == '-'; } -// Takes infix form of expression as string and returns pointer on postfix form string. +// Takes infix form of expression as string and returns pointer to postfix form string. Please, dont forget free memory. +// Can track unbalanced brackets and correctness of order of numbers and operators. Cant track extraneous symbols. +// If the error is tracked, returns pointer to the string with the error description. char* sortingStation(char* infixForm) { - char* output = calloc(strlen(infixForm), sizeof(output) + 1); + char* output = calloc(2 * strlen(infixForm), sizeof(output)); Stack* operators = newStack(); + bool isNumberTurn = true; // For check correctness of order. + char* errorMessage = calloc(64, sizeof(*errorMessage)); // For error returns. int indexOfOutput = 0; for (int indexOfInfix = 0; infixForm[indexOfInfix] != '\0'; ++indexOfInfix) { if (isdigit(infixForm[indexOfInfix])) { + if (!isNumberTurn) { + strcat(errorMessage, "Error! Order of numbers and operators is incorrect."); + } + isNumberTurn = !isNumberTurn; + output[indexOfOutput] = infixForm[indexOfInfix]; output[indexOfOutput + 1] = ' '; indexOfOutput += 2; } - if (isOperatorFirstPriority(infixForm[indexOfInfix]) || infixForm[indexOfInfix] == '(') { + if (isOperatorFirstPriority(infixForm[indexOfInfix])) { + if (isNumberTurn) { + strcat(errorMessage, "Error! Order of numbers and operators is incorrect."); + } + isNumberTurn = !isNumberTurn; + push(operators, infixForm[indexOfInfix]); } if (isOperatorSecondPriority(infixForm[indexOfInfix])) { + if (isNumberTurn) { + strcat(errorMessage, "Error! Order of numbers and operators is incorrect."); + } + isNumberTurn = !isNumberTurn; + while (!isEmpty(operators) && peek(operators) != '(') { - output[indexOfOutput] = pop(operators); - output[indexOfOutput + 1] = ' '; - indexOfOutput += 2; + output[indexOfOutput++] = pop(operators); + output[indexOfOutput++] = ' '; + } + push(operators, infixForm[indexOfInfix]); + } + if (infixForm[indexOfInfix] == '(') { + if (!isNumberTurn) { + strcat(errorMessage, "Error! Number before opening bracket."); } + push(operators, infixForm[indexOfInfix]); } + // Многоступенчатость в целях предотвращения одновременного добавления сразу нескольких сообщений об ошибке. if (infixForm[indexOfInfix] == ')') { - while (peek(operators) != '(') { - output[indexOfOutput] = pop(operators); - output[indexOfOutput + 1] = ' '; - indexOfOutput += 2; + if (isEmpty(operators)) { + strcat(errorMessage, "Error! Brackets not opened."); + } else { + if (isNumberTurn) { + strcat(errorMessage, "Error! Operator before closing bracket."); + } else { + while (peek(operators) != '(') { + output[indexOfOutput++] = pop(operators); + output[indexOfOutput++] = ' '; + + if (isEmpty(operators)) { + strcat(errorMessage, "Error! Brackets not opened."); + break; + } + } + if (!isEmpty(operators)) { + pop(operators); + } + } } - pop(operators); + } + + // Данное условие истинно, когда строки не равны. + if (strcmp(errorMessage, "")) { + free(output); + deleteStack(operators); + return errorMessage; } } while (!isEmpty(operators)) { - output[indexOfOutput] = pop(operators); - output[indexOfOutput + 1] = ' '; - indexOfOutput += 2; + output[indexOfOutput++] = pop(operators); + output[indexOfOutput++] = ' '; + + if (output[indexOfOutput - 2] == '(') { + free(output); + deleteStack(operators); + strcat(errorMessage, "Error! Brackets not closed."); + return errorMessage; + } } deleteStack(operators); @@ -61,35 +115,42 @@ char* sortingStation(char* infixForm) int main() { - char* input1 = "(1 + 1) * 2"; - char* output1 = sortingStation(input1); - char* input2 = "4/2+6"; - char* output2 = sortingStation(input2); - char* input3 = "((1 + 2) * 3) - 4"; - char* output3 = sortingStation(input3); - char* input4 = "((((1))))"; - char* output4 = sortingStation(input4); - char* input5 = "(1 + (4 + 5 + 2) - 3) + (6 + 8)"; - char* output5 = sortingStation(input5); - char* input6 = "1"; - char* output6 = sortingStation(input6); - char* input7 = ""; - char* output7 = sortingStation(input7); - - printf("%s -> %s\n", input1, output1); - printf("%s -> %s\n", input2, output2); - printf("%s -> %s\n", input3, output3); - printf("%s -> %s\n", input4, output4); - printf("%s -> %s\n", input5, output5); - printf("%s -> %s\n", input6, output6); - printf("%s -> %s\n", input7, output7); - - free(output1); - free(output2); - free(output3); - free(output4); - free(output5); - free(output6); - free(output7); + char* testSimple = sortingStation("(1 + (4 + 5 / 2) - 3) + (6 + 8)"); + char* testNoSpaces = sortingStation("4/2+6"); + char* testManyBrackets = sortingStation("((((1))))"); + char* testOnlyNumber = sortingStation("1"); + char* testEmpty = sortingStation(""); + char* testIncorrectOrder = sortingStation("1 + + 1"); + char* testIncorrectOrder2 = sortingStation("+ 1"); + char* testNumberBeforeBracket = sortingStation("1 (+ 3)"); + char* testOperatorBeforeBracket = sortingStation("1 + (2 + ) 3"); + char* testBracketsNotOpened = sortingStation("1 + 2)"); + char* testBracketsNotClosed = sortingStation("1 + (2 + 3"); + + assert(!strcmp(testSimple, "1 4 5 2 / + + 3 - 6 8 + + ") && "testSimple incorrect."); + assert(!strcmp(testNoSpaces, "4 2 / 6 + ") && "testNoSpaces incorrect."); + assert(!strcmp(testManyBrackets, "1 ") && "testManyBrackets incorrect."); + assert(!strcmp(testOnlyNumber, "1 ") && "testOnlyNumber incorrect."); + assert(!strcmp(testEmpty, "") && "testEmpty incorrect."); + assert(!strcmp(testIncorrectOrder, "Error! Order of numbers and operators is incorrect.") && "testIncorrectOrder incorrect."); + assert(!strcmp(testIncorrectOrder2, "Error! Order of numbers and operators is incorrect.") && "testIncorrectOrder2 incorrect."); + assert(!strcmp(testNumberBeforeBracket, "Error! Number before opening bracket.") && "testNumberBeforeBracket incorrect."); + assert(!strcmp(testOperatorBeforeBracket, "Error! Operator before closing bracket.") && "testOperatorBeforeBracket incorrect."); + assert(!strcmp(testBracketsNotOpened, "Error! Brackets not opened.") && "testBracketsNotOpened incorrect."); + assert(!strcmp(testBracketsNotClosed, "Error! Brackets not closed.") && "testBracketsNotClosed incorrect."); + + printf("All tests passed successfully.\n"); + + free(testSimple); + free(testNoSpaces); + free(testManyBrackets); + free(testOnlyNumber); + free(testEmpty); + free(testIncorrectOrder); + free(testIncorrectOrder2); + free(testNumberBeforeBracket); + free(testOperatorBeforeBracket); + free(testBracketsNotOpened); + free(testBracketsNotClosed); return 0; } From da6c40c0a32328b41ea5339769db2a72872ee957 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Tue, 16 Dec 2025 16:37:08 +0300 Subject: [PATCH 30/32] Remove memory leaks --- src/stack_and_queue/stack/advanced_bracket_balance.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 4d01a03..91a9c06 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -28,6 +28,7 @@ bool isBracketsBalanced(char* string) } if (isClosingBracket(string[i])) { if (isEmpty(brackets)) { + deleteStack(brackets); return false; } @@ -45,6 +46,7 @@ bool isBracketsBalanced(char* string) } if (!isClosed) { + deleteStack(brackets); return false; } } From 5c1ba8732355cd5f3cd1ae8adf94897f833590c5 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 18 Dec 2025 09:22:52 +0300 Subject: [PATCH 31/32] Update final check for unclosed brackets --- src/stack_and_queue/stack/advanced_bracket_balance.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/stack_and_queue/stack/advanced_bracket_balance.c b/src/stack_and_queue/stack/advanced_bracket_balance.c index 91a9c06..8203078 100644 --- a/src/stack_and_queue/stack/advanced_bracket_balance.c +++ b/src/stack_and_queue/stack/advanced_bracket_balance.c @@ -51,14 +51,10 @@ bool isBracketsBalanced(char* string) } } } - // Check for unclosed brackets. - if (!isEmpty(brackets)) { - deleteStack(brackets); - return false; - } + bool isAllClosed = isEmpty(brackets); deleteStack(brackets); - return true; + return isAllClosed; } int main() From 45be467dfe3b9ab58593b03c04a8498e87c3f1c4 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Thu, 18 Dec 2025 09:27:44 +0300 Subject: [PATCH 32/32] Delete build instruction from stack folder --- src/stack_and_queue/stack/README.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 src/stack_and_queue/stack/README.md diff --git a/src/stack_and_queue/stack/README.md b/src/stack_and_queue/stack/README.md deleted file mode 100644 index 5a16c22..0000000 --- a/src/stack_and_queue/stack/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## Compile instruction for sorting station -gcc -Wall -Wextra -pedantic -O2 stack.c -c - -gcc -Wall -Wextra -pedantic -O2 stack.o sorting_station.c