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 5abe67583ba80c69cc5abbf483cee1b5eafed82d Mon Sep 17 00:00:00 2001 From: Pavel Kuliaka Date: Mon, 20 Oct 2025 14:29:27 +0300 Subject: [PATCH 7/7] Implemented sorting station --- StackAndQueue/sorting_station.c | 62 +++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 StackAndQueue/sorting_station.c diff --git a/StackAndQueue/sorting_station.c b/StackAndQueue/sorting_station.c new file mode 100644 index 0000000..4da7898 --- /dev/null +++ b/StackAndQueue/sorting_station.c @@ -0,0 +1,62 @@ +#include "Stack\stack.h" +#include +#include +#include +#include + +int getPriority(char operation) { + return (operation == '+' || operation == '-') ? 1 : (operation == '*' || operation == '/') ? 2 : 0; +} + +char* sortingStationAlgorithm(char* expression) { + expression = strdup(expression); + + Stack* stack = stackNew(); + + char* token = strtok(expression, " "); + + char* result = malloc(strlen(expression) * 2); + result[0] = '\0'; + + while (token != NULL) { + if (isdigit(token[0])) { + strcat(result, token); + strcat(result, " "); + } + else if (token[0] == '(') { + stackPush(&stack, strdup(token)); + } + else if (token[0] == ')') { + while (stack != NULL && stack -> value != NULL && + ((char*) stack -> value)[0] != '(') { + strcat(result, (char*) stack -> value); + strcat(result, " "); + stackPop(&stack); + } + if (stack && stack -> value) { + stackPop(&stack); + } + } + else if (token[0] == '*' || token[0] == '/' || token[0] == '+' || token[0] == '-') { + while (stack != NULL && stack -> value != NULL && + getPriority(((char*) stack -> value)[0]) >= getPriority(token[0])) { + strcat(result, (char*) stack -> value); + strcat(result, " "); + stackPop(&stack); + } + stackPush(&stack, strdup(token)); + } + token = strtok(NULL, " "); + } + + while (stack != NULL && stack -> value != NULL) { + strcat(result, (char*) stack -> value); + strcat(result, " "); + stackPop(&stack); + } + + free(expression); + stackFree(&stack); + + return result; +}