From d765f502098be74e7b5cde74648589a4675ec668 Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 02:19:37 +0300 Subject: [PATCH 1/7] Implemented stack --- Stack/stack.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Stack/stack.c diff --git a/Stack/stack.c b/Stack/stack.c new file mode 100644 index 0000000..e6c1eab --- /dev/null +++ b/Stack/stack.c @@ -0,0 +1,44 @@ +#include +#include + +typedef struct StackStruct { + void * value; + struct StackStruct *previous; +} Stack; + +Stack* stackNew() { + Stack* stack = malloc(sizeof(Stack)); + if (stack == NULL) { + puts("Memory allocation error"); + return NULL; + } + stack -> previous = NULL; + stack -> value = NULL; + return stack; +} + +void stackPush(Stack** stack, void* value) { + if (stack == NULL || *stack == NULL) { + puts("Incorrect arguments error"); + } + Stack* stackTop = malloc(sizeof(Stack)); + if (stackTop == NULL) { + puts("Memory allocation error"); + } + stackTop -> value = value; + stackTop -> previous = stack; + +} + +Stack* stackPop(Stack* stack) { + if (stack == NULL) { + puts("Incorrect arguments error"); + return NULL; + } + Stack* stackTop = stack -> previous; + if (stackTop != NULL) { + free(stack); + return stackTop; + } + return stack; +} From ba7ca1b67081b3f9d653a8cadd389606fbc15caa Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 02:26:53 +0300 Subject: [PATCH 2/7] Renamed directory Stack to StackAndQueue --- StackAndQueue/stack.c | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 StackAndQueue/stack.c diff --git a/StackAndQueue/stack.c b/StackAndQueue/stack.c new file mode 100644 index 0000000..e6c1eab --- /dev/null +++ b/StackAndQueue/stack.c @@ -0,0 +1,44 @@ +#include +#include + +typedef struct StackStruct { + void * value; + struct StackStruct *previous; +} Stack; + +Stack* stackNew() { + Stack* stack = malloc(sizeof(Stack)); + if (stack == NULL) { + puts("Memory allocation error"); + return NULL; + } + stack -> previous = NULL; + stack -> value = NULL; + return stack; +} + +void stackPush(Stack** stack, void* value) { + if (stack == NULL || *stack == NULL) { + puts("Incorrect arguments error"); + } + Stack* stackTop = malloc(sizeof(Stack)); + if (stackTop == NULL) { + puts("Memory allocation error"); + } + stackTop -> value = value; + stackTop -> previous = stack; + +} + +Stack* stackPop(Stack* stack) { + if (stack == NULL) { + puts("Incorrect arguments error"); + return NULL; + } + Stack* stackTop = stack -> previous; + if (stackTop != NULL) { + free(stack); + return stackTop; + } + return stack; +} From 127ff329b085919df889ee7e3b188da0c5df6e28 Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 12:00:42 +0300 Subject: [PATCH 3/7] Implemented a header file. Made small fixes --- StackAndQueue/stack.c | 38 ++++++++++++++++++++++++-------------- StackAndQueue/stack.h | 14 ++++++++++++++ 2 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 StackAndQueue/stack.h diff --git a/StackAndQueue/stack.c b/StackAndQueue/stack.c index e6c1eab..108392a 100644 --- a/StackAndQueue/stack.c +++ b/StackAndQueue/stack.c @@ -1,11 +1,8 @@ +#include "stack.h" + #include #include -typedef struct StackStruct { - void * value; - struct StackStruct *previous; -} Stack; - Stack* stackNew() { Stack* stack = malloc(sizeof(Stack)); if (stack == NULL) { @@ -20,25 +17,38 @@ Stack* stackNew() { void stackPush(Stack** stack, void* value) { if (stack == NULL || *stack == NULL) { puts("Incorrect arguments error"); + return; } Stack* stackTop = malloc(sizeof(Stack)); if (stackTop == NULL) { puts("Memory allocation error"); + return; } stackTop -> value = value; - stackTop -> previous = stack; - + stackTop -> previous = *stack; + *stack = stackTop; } -Stack* stackPop(Stack* stack) { - if (stack == NULL) { +void stackPop(Stack** stack) { + if (stack == NULL || *stack == NULL) { puts("Incorrect arguments error"); - return NULL; + return; } - Stack* stackTop = stack -> previous; + Stack* stackTop = (*stack) -> previous; if (stackTop != NULL) { - free(stack); - return stackTop; + free(*stack); + *stack = stackTop; } - return stack; +} + +void stackFree(Stack** stack) { + if (stack == NULL || *stack == NULL) { + puts("Incorrect arguments error"); + return; + } + while ((*stack)->previous != NULL) { + stackPop(stack); + } + free(*stack); + *stack = NULL; } diff --git a/StackAndQueue/stack.h b/StackAndQueue/stack.h new file mode 100644 index 0000000..7631e96 --- /dev/null +++ b/StackAndQueue/stack.h @@ -0,0 +1,14 @@ +#pragma once + +typedef struct StackStruct { + void * value; + struct StackStruct *previous; +} Stack; + +Stack* stackNew(); + +void stackPush(Stack**, void*); + +void stackPop(Stack**); + +void stackFree(Stack**); From fec8236990457ca34d11cfb8fd4d0d2319618c97 Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 12:06:23 +0300 Subject: [PATCH 4/7] Deleted directory Stack --- Stack/stack.c | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 Stack/stack.c diff --git a/Stack/stack.c b/Stack/stack.c deleted file mode 100644 index e6c1eab..0000000 --- a/Stack/stack.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -typedef struct StackStruct { - void * value; - struct StackStruct *previous; -} Stack; - -Stack* stackNew() { - Stack* stack = malloc(sizeof(Stack)); - if (stack == NULL) { - puts("Memory allocation error"); - return NULL; - } - stack -> previous = NULL; - stack -> value = NULL; - return stack; -} - -void stackPush(Stack** stack, void* value) { - if (stack == NULL || *stack == NULL) { - puts("Incorrect arguments error"); - } - Stack* stackTop = malloc(sizeof(Stack)); - if (stackTop == NULL) { - puts("Memory allocation error"); - } - stackTop -> value = value; - stackTop -> previous = stack; - -} - -Stack* stackPop(Stack* stack) { - if (stack == NULL) { - puts("Incorrect arguments error"); - return NULL; - } - Stack* stackTop = stack -> previous; - if (stackTop != NULL) { - free(stack); - return stackTop; - } - return stack; -} From dae3b7e8aac864b6b572bc0f3ea1fbf58681a894 Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 12:13:29 +0300 Subject: [PATCH 5/7] Moved files --- StackAndQueue/{ => Stack}/stack.c | 0 StackAndQueue/{ => Stack}/stack.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename StackAndQueue/{ => Stack}/stack.c (100%) rename StackAndQueue/{ => Stack}/stack.h (100%) diff --git a/StackAndQueue/stack.c b/StackAndQueue/Stack/stack.c similarity index 100% rename from StackAndQueue/stack.c rename to StackAndQueue/Stack/stack.c diff --git a/StackAndQueue/stack.h b/StackAndQueue/Stack/stack.h similarity index 100% rename from StackAndQueue/stack.h rename to StackAndQueue/Stack/stack.h From 555a2d19b0c4d52b5a60ebceb4a3235912e590ef Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 13:52:25 +0300 Subject: [PATCH 6/7] Added comments to stack.h --- StackAndQueue/Stack/stack.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/StackAndQueue/Stack/stack.h b/StackAndQueue/Stack/stack.h index 7631e96..646ac0b 100644 --- a/StackAndQueue/Stack/stack.h +++ b/StackAndQueue/Stack/stack.h @@ -1,14 +1,20 @@ #pragma once +// The StackStruct structure with the value and previous fields +// Defined as Stack typedef struct StackStruct { void * value; struct StackStruct *previous; } Stack; +// Create a new stack Stack* stackNew(); +// Add a new element to the top of the stack void stackPush(Stack**, void*); +// Remove an element from the top of the stack void stackPop(Stack**); +// Free the stack void stackFree(Stack**); From 578747fe23b7e3adc7c2430b1f9408764ddbbe2b Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Sun, 19 Oct 2025 13:55:49 +0300 Subject: [PATCH 7/7] Implemented advanced braces balance --- StackAndQueue/advanced_braces_balance.c | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 StackAndQueue/advanced_braces_balance.c diff --git a/StackAndQueue/advanced_braces_balance.c b/StackAndQueue/advanced_braces_balance.c new file mode 100644 index 0000000..38c65dc --- /dev/null +++ b/StackAndQueue/advanced_braces_balance.c @@ -0,0 +1,54 @@ +#include "Stack\stack.h" + +#include +#include +#include +#include + +bool checkBalance(char* string) { + Stack* stack = stackNew(); + if (stack == NULL) { + return false; + } + + for (int index = 0; index < strlen(string); ++index) { + const char character = string[index]; + + if (character == '{' || character == '[' || character == '(') { + char* value = malloc(sizeof(char)); + if (value == NULL) { + puts("Memory allocation error"); + stackFree(&stack); + return false; + } + *value = character; + stackPush(&stack, value); + } + + else if (character == '}' || character == ']' || character == ')') { + if (stack -> value == NULL) { + stackFree(&stack); + return false; + } + + char* topValue = (char*) stack -> value; + char topChar = (char)*topValue; + + if ((character == '}' && topChar != '{') || + (character == ']' && topChar != '[') || + (character == ')' && topChar != '(')) { + stackFree(&stack); + return false; + } + + free(stack->value); + stackPop(&stack); + } + } + + bool balanced = (stack->value == NULL); + + stackFree(&stack); + + return balanced; +}