From 392214e2cb3cdcf0734788fe11ca91d46e621cd4 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Thu, 16 Oct 2025 15:40:01 +0000 Subject: [PATCH 1/7] The stack is implemended in a separated stack folder (stack.c and stack.h) --- Stack/stack.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ Stack/stack.h | 28 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 Stack/stack.c create mode 100644 Stack/stack.h diff --git a/Stack/stack.c b/Stack/stack.c new file mode 100644 index 0000000..51cb4a7 --- /dev/null +++ b/Stack/stack.c @@ -0,0 +1,80 @@ +#include +#include +#include "stack.h" + + +typedef struct tag_obj +{ + int data; + struct tag_obj* next; +} OBJ; + +OBJ* stack_new(void) +{ + return NULL; +} + +OBJ* stack_push(OBJ* top, int data) +{ + OBJ* ptr = malloc(sizeof(OBJ)); + ptr->data = data; + ptr->next = top; + + return ptr; +} + +// Взять элемент со стека +OBJ* stack_pop(OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return top; + } + + OBJ* ptr_next = top->next; + free(top); + + return ptr_next; +} + +OBJ* stack_delete(OBJ* top) +{ + OBJ* current = top; + while (current != NULL) + { + OBJ* temp = current; + current = current->next; + free(temp); + } + + return 0; +} + +// Функция для просмотра элемента сверху +int stack_peek(const OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return -1; + } + + return top->data; +} + +void show(const OBJ* top) +{ + const OBJ* current = top; + if(top == NULL) + { + printf("Стек пуст\n"); + return; + } + + while(current != NULL) + { + printf("%d\n", current->data); + current = current->next; + } +} diff --git a/Stack/stack.h b/Stack/stack.h new file mode 100644 index 0000000..ee80b5f --- /dev/null +++ b/Stack/stack.h @@ -0,0 +1,28 @@ +#ifdef STACK_H +#define STACK_H + +typedef struct tag_obj +{ + int data; + struct tag_obj* next; +} OBJ; + +// Создание нового стека +OBJ* stack_new(void); + +// Добавление элемента на стек +OBJ* stack_push(OBJ* top, int data); + +// Удаление верхнего элемента +OBJ* stack_pop(OBJ* top); + +// Удаление стека +OBJ* stack_delete(OBJ* top); + +// Просмотр верхнего элемента +int stack_peek(OBJ* top); + +// Вывод содержимого +void stack_show(OBJ* top); + +#endif \ No newline at end of file From 47932f574630c258a833082c51a48248ececab0b Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 22 Oct 2025 17:52:16 +0000 Subject: [PATCH 2/7] minor stack fix --- 5.Stack-and-Quene/Stack/stack.c | 74 +++++++++++++++++++++++++++++++++ 5.Stack-and-Quene/Stack/stack.h | 28 +++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 5.Stack-and-Quene/Stack/stack.c create mode 100644 5.Stack-and-Quene/Stack/stack.h diff --git a/5.Stack-and-Quene/Stack/stack.c b/5.Stack-and-Quene/Stack/stack.c new file mode 100644 index 0000000..7e07719 --- /dev/null +++ b/5.Stack-and-Quene/Stack/stack.c @@ -0,0 +1,74 @@ +#include +#include +#include "stack.h" + + +OBJ* stack_new(void) +{ + return NULL; +} + +OBJ* stack_push(OBJ* top, char data) +{ + OBJ* ptr = malloc(sizeof(OBJ)); + ptr->data = data; + ptr->next = top; + + return ptr; +} + +// Взять элемент со стека +OBJ* stack_pop(OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return top; + } + + OBJ* ptr_next = top->next; + free(top); + + return ptr_next; +} + +OBJ* stack_delete(OBJ* top) +{ + OBJ* current = top; + while (current != NULL) + { + OBJ* temp = current; + current = current->next; + free(temp); + } + + return 0; +} + +// Функция для просмотра элемента сверху +int stack_peek(const OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return -1; + } + + return top->data; +} + +void show(const OBJ* top) +{ + const OBJ* current = top; + if(top == NULL) + { + printf("Стек пуст\n"); + return; + } + + while(current != NULL) + { + printf("%d\n", current->data); + current = current->next; + } +} diff --git a/5.Stack-and-Quene/Stack/stack.h b/5.Stack-and-Quene/Stack/stack.h new file mode 100644 index 0000000..1e5ea1b --- /dev/null +++ b/5.Stack-and-Quene/Stack/stack.h @@ -0,0 +1,28 @@ +#ifndef STACK_H +#define STACK_H + +typedef struct tag_obj +{ + int data; + struct tag_obj* next; +} OBJ; + +// Создание нового стека +OBJ* stack_new(void); + +// Добавление элемента на стек +OBJ* stack_push(OBJ* top, int data); + +// Удаление верхнего элемента +OBJ* stack_pop(OBJ* top); + +// Удаление стека +OBJ* stack_delete(OBJ* top); + +// Просмотр верхнего элемента +int stack_peek(OBJ* top); + +// Вывод содержимого +void stack_show(OBJ* top); + +#endif \ No newline at end of file From 7c2ba6de75789ec72694cd7f9cd5da0585ef19e3 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 22 Oct 2025 17:56:47 +0000 Subject: [PATCH 3/7] minnor fix stack 2 --- 5.Stack-and-Quene/Stack/stack.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.Stack-and-Quene/Stack/stack.h b/5.Stack-and-Quene/Stack/stack.h index 1e5ea1b..79fb7e8 100644 --- a/5.Stack-and-Quene/Stack/stack.h +++ b/5.Stack-and-Quene/Stack/stack.h @@ -3,7 +3,7 @@ typedef struct tag_obj { - int data; + char data; struct tag_obj* next; } OBJ; From 8ff136714d13102e584eb9be4d7b6b9ea895e919 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 22 Oct 2025 17:59:54 +0000 Subject: [PATCH 4/7] minnor fix stack 3 --- 5.Stack-and-Quene/Stack/stack.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5.Stack-and-Quene/Stack/stack.h b/5.Stack-and-Quene/Stack/stack.h index 79fb7e8..67bc80d 100644 --- a/5.Stack-and-Quene/Stack/stack.h +++ b/5.Stack-and-Quene/Stack/stack.h @@ -11,7 +11,7 @@ typedef struct tag_obj OBJ* stack_new(void); // Добавление элемента на стек -OBJ* stack_push(OBJ* top, int data); +OBJ* stack_push(OBJ* top, char data); // Удаление верхнего элемента OBJ* stack_pop(OBJ* top); @@ -20,7 +20,7 @@ OBJ* stack_pop(OBJ* top); OBJ* stack_delete(OBJ* top); // Просмотр верхнего элемента -int stack_peek(OBJ* top); +char stack_peek(OBJ* top); // Вывод содержимого void stack_show(OBJ* top); From 9f402bb79d9737923d713eeec627756ebe546200 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 22 Oct 2025 18:02:21 +0000 Subject: [PATCH 5/7] minor fix stack 4 --- 5.Stack-and-Quene/Stack/stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.Stack-and-Quene/Stack/stack.c b/5.Stack-and-Quene/Stack/stack.c index 7e07719..f23663f 100644 --- a/5.Stack-and-Quene/Stack/stack.c +++ b/5.Stack-and-Quene/Stack/stack.c @@ -46,7 +46,7 @@ OBJ* stack_delete(OBJ* top) } // Функция для просмотра элемента сверху -int stack_peek(const OBJ* top) +char stack_peek(const OBJ* top) { if(top == NULL) { From a7a72c20edb47eb7de5b0a093f375238b0aa8dd0 Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Wed, 22 Oct 2025 18:05:32 +0000 Subject: [PATCH 6/7] minor fix stack 5 --- 5.Stack-and-Quene/Stack/stack.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.Stack-and-Quene/Stack/stack.h b/5.Stack-and-Quene/Stack/stack.h index 67bc80d..83434cc 100644 --- a/5.Stack-and-Quene/Stack/stack.h +++ b/5.Stack-and-Quene/Stack/stack.h @@ -20,7 +20,7 @@ OBJ* stack_pop(OBJ* top); OBJ* stack_delete(OBJ* top); // Просмотр верхнего элемента -char stack_peek(OBJ* top); +char stack_peek(const OBJ* top); // Вывод содержимого void stack_show(OBJ* top); From dd929d25ffdc7b89ec370b400f4f71e4956b7ecd Mon Sep 17 00:00:00 2001 From: Stanislav Klimovich Date: Thu, 23 Oct 2025 16:41:08 +0000 Subject: [PATCH 7/7] The marshalling yard has been completed (Task 2) --- 5.Stack-and-Quene/Task_2/Sorting-yard.c | 118 ++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 5.Stack-and-Quene/Task_2/Sorting-yard.c diff --git a/5.Stack-and-Quene/Task_2/Sorting-yard.c b/5.Stack-and-Quene/Task_2/Sorting-yard.c new file mode 100644 index 0000000..a027cee --- /dev/null +++ b/5.Stack-and-Quene/Task_2/Sorting-yard.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include "../Stack/stack.h" + + +int precedence(char op) +{ + switch(op) + { + case '+': + case '-': + return 1; + + case '*': + case '/': + return 2; + + default: + return 0; + } +} + +int is_operator(char c) +{ + return c == '+' || c == '-' || c == '*' || c == '/'; +} + +char* infix_to_postfix(const char* infix) +{ + static char output[1000]; + output[0] = '\0'; + + OBJ* stack = stack_new(); + int output_index = 0; + + for (int i = 0; infix[i] != '\0'; i++) + { + char token = infix[i]; + + if (isspace(token)) + { + continue; + } + + if (isdigit(token)) + { + while (isdigit(infix[i])) + { + output[output_index++] = infix[i++]; + } + + output[output_index++] = ' '; + i--; + } + + else if (token == '(') + { + stack = stack_push(stack, token); + } + + else if (token == ')') + { + while (stack != NULL && stack_peek(stack) != '(') + { + output[output_index++] = stack_peek(stack); + output[output_index++] = ' '; + stack = stack_pop(stack); + } + + if (stack != NULL && stack_peek(stack) == '(') + { + stack = stack_pop(stack); + } + } + + else if (is_operator(token)) + { + while (stack != NULL && stack_peek(stack) != '(' && + precedence(stack_peek(stack)) >= precedence(token)) + { + output[output_index++] = stack_peek(stack); + output[output_index++] = ' '; + stack = stack_pop(stack); + } + + stack = stack_push(stack, token); + } + } + + while (stack != NULL) + { + output[output_index++] = stack_peek(stack); + output[output_index++] = ' '; + stack = stack_pop(stack); + } + + if (output_index > 0 && output[output_index-1] == ' ') + { + output_index--; + } + + output[output_index] = '\0'; + stack_delete(stack); + return output; +} + +int main() { + char infix[1000]; + + printf("Введите инфиксное выражение: "); + scanf("%999[^\n]", infix); + + char* postfix = infix_to_postfix(infix); + printf("Постфиксная запись: %s\n", postfix); + + return 0; +} \ No newline at end of file