From ef7191bcec21d535431cf05003e474782c0f3ca5 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sat, 11 Oct 2025 22:13:31 +0300 Subject: [PATCH 01/16] Add stack.c and stack.h --- src/stack.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/stack.h | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/stack.c create mode 100644 src/stack.h diff --git a/src/stack.c b/src/stack.c new file mode 100644 index 0000000..cf7a771 --- /dev/null +++ b/src/stack.c @@ -0,0 +1,50 @@ +#include +#include "stack.h" + +struct StackNode { + int value; + struct StackNode* next; +}; + +struct Stack { + struct StackNode* head; +}; + +struct Stack newStack(void) +{ + struct Stack stack = { + .head = NULL + }; + return stack; +} + +void push(struct Stack* stack, int value) +{ + struct StackNode* node = malloc(sizeof(struct StackNode)); + node->value = value; + node->next = stack->head; + stack->head = node; +} + +int pop(struct Stack* stack) +{ + struct StackNode* oldNode = stack->head; + int res = oldNode->value; + stack->head = oldNode->next; + free(oldNode); + return res; +} + +int peek(struct Stack* stack) +{ + struct StackNode* headNode = stack->head; + int res = headNode->value; + return res; +} + +void deleteStack(struct Stack* stack) +{ + while (stack->head != NULL) { + pop(stack); + } +} diff --git a/src/stack.h b/src/stack.h new file mode 100644 index 0000000..9a9bb46 --- /dev/null +++ b/src/stack.h @@ -0,0 +1,41 @@ +#pragma once +/* + Функция создания "нового стека". + Ничего не принимает. + Ничего не возвращает. + Создает первый элемент в стеке без значения (value), ссылающийся на NULL + */ +struct Stack newStack(void); + + +/* + Функция, добавляющая новый элемент в стек. + Принимает указатель на последний элемент стека, куда пользователь хочет добавить новый элемент, и его значение типа int. + Ничего не возвращает. + */ +void push(struct Stack* stack, int value); + + +/* + Pop функция берет элемент из стека и возвращает его значение, + при этом элемент больше не находится в стеке. + На вход принимает указатель на последний элемент стека. + Пользователь должен проверить, что он не передает в функцию пустой стек. + */ +int pop(struct Stack* stack); + + +/* + Функция peek принимает на вход указатель на последний элемент стека, + возвращает значение, лежащее в последнем элементе стека. + */ +int peek(struct Stack* stack); + + +/* + Функция удаления стека (освобождения памяти). + На вход принимает указатель на последний элемент стека. + Ничего не возвращает. + Перебирает элементы стека и освобождает память, которую они занимают. + */ +void deleteStack(struct Stack* stack); From b6b1a3f582c8007f15045d2428f869278e8b91b8 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 14 Oct 2025 00:52:35 +0300 Subject: [PATCH 02/16] Slightly change stack.c and stack.h --- src/stack.c | 11 +---------- src/stack.h | 49 ++++++++++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/stack.c b/src/stack.c index cf7a771..5a9c747 100644 --- a/src/stack.c +++ b/src/stack.c @@ -1,14 +1,5 @@ -#include #include "stack.h" - -struct StackNode { - int value; - struct StackNode* next; -}; - -struct Stack { - struct StackNode* head; -}; +#include struct Stack newStack(void) { diff --git a/src/stack.h b/src/stack.h index 9a9bb46..3945e82 100644 --- a/src/stack.h +++ b/src/stack.h @@ -1,41 +1,48 @@ #pragma once +// структура обыкновенного элемента в стеке +struct StackNode { + int value; + struct StackNode* next; +}; + +// сам стек (структура содержащая указатель на первый элемент стека) +struct Stack { + struct StackNode* head; +}; + /* - Функция создания "нового стека". - Ничего не принимает. - Ничего не возвращает. - Создает первый элемент в стеке без значения (value), ссылающийся на NULL + * Функция создания "нового стека". + * Ничего не принимает. + * Возвращает элемент типа struct Stack. + * Создает первый элемент в стеке без значения (value), ссылающийся на NULL */ struct Stack newStack(void); - /* - Функция, добавляющая новый элемент в стек. - Принимает указатель на последний элемент стека, куда пользователь хочет добавить новый элемент, и его значение типа int. - Ничего не возвращает. + * Функция, добавляющая новый элемент в стек. + * Принимает указатель на последний элемент стека, куда пользователь хочет добавить новый элемент, и его значение типа int. + * Ничего не возвращает. */ void push(struct Stack* stack, int value); - /* - Pop функция берет элемент из стека и возвращает его значение, - при этом элемент больше не находится в стеке. - На вход принимает указатель на последний элемент стека. - Пользователь должен проверить, что он не передает в функцию пустой стек. + * Pop функция берет элемент из стека и возвращает его значение, + * при этом элемент больше не находится в стеке. + * На вход принимает указатель на последний элемент стека. + * Пользователь должен проверить, что он не передает в функцию пустой стек. */ int pop(struct Stack* stack); - /* - Функция peek принимает на вход указатель на последний элемент стека, - возвращает значение, лежащее в последнем элементе стека. + * Функция peek принимает на вход указатель на последний элемент стека, + * возвращает значение, лежащее в последнем элементе стека. */ int peek(struct Stack* stack); - /* - Функция удаления стека (освобождения памяти). - На вход принимает указатель на последний элемент стека. - Ничего не возвращает. - Перебирает элементы стека и освобождает память, которую они занимают. + * Функция удаления стека (освобождения памяти). + * На вход принимает указатель на последний элемент стека. + * Ничего не возвращает. + * Перебирает элементы стека и освобождает память, которую они занимают. */ void deleteStack(struct Stack* stack); From f1357e97d06d95077fd01f35cd24541290686696 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 14 Oct 2025 18:52:56 +0300 Subject: [PATCH 03/16] Add sorted station task --- src/sortingStation.c | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/sortingStation.c diff --git a/src/sortingStation.c b/src/sortingStation.c new file mode 100644 index 0000000..9836fc6 --- /dev/null +++ b/src/sortingStation.c @@ -0,0 +1,101 @@ +#include "stack.h" +#include +#include +#include +#include + +// функция для определения приоритета операнда +- это 1, * / это 2 +int getPreoritite(char operand) +{ + if (operand == '+' || operand == '-') { + return 1; + } else if (operand == '*' || operand == '/') { + return 2; + } + return 0; +} + +char* convertString(char* string, int len) +{ + struct Stack stack = newStack(); + char* queue = malloc(101 * sizeof(char)); + // не все значения будут идти в очередь, а надо, чтобы элементы в ней располагались один за другим, для этого пусть будет этот счетчик + int countForQueue = 0; + int i = 0; + + while (i != len) { + // если число + if (isdigit(string[i])) { + queue[countForQueue] = string[i]; + ++countForQueue; + } + // если открывающаяся скобка, добавляем ее в стек + if (string[i] == '(') { + push(&stack, string[i]); + } + // если закрывающаяся, то переберем все значения стека и разместим их в очереди, пока не встретится открывающая скобка + else if (string[i] == ')') { + while ((stack.head != NULL) && (peek(&stack) != '(')) { + queue[countForQueue] = pop(&stack); + ++countForQueue; + } + if ((stack.head != NULL) && (peek(&stack) == '(')) { + pop(&stack); + } else if (stack.head == NULL) { + deleteStack(&stack); + return "ERROR: you missed openning bracket symbol"; + } + } + + // если операторы + - * / + if ((string[i] == '+') || (string[i] == '-') || (string[i] == '*') || (string[i] == '/')) { + // если оператор, но по приоритету такой же или меньший чем в стеке + while ((stack.head != NULL) && (getPreoritite(string[i]) <= getPreoritite(peek(&stack)))) { + queue[countForQueue] = pop(&stack); + ++countForQueue; + } + push(&stack, string[i]); + } + ++i; + } + if (stack.head != NULL) { + while (stack.head != NULL) { + if (peek(&stack) == '(') { + deleteStack(&stack); + return "ERROR: you missed closing bracket symbol"; + } + queue[countForQueue] = pop(&stack); + ++countForQueue; + } + } + deleteStack(&stack); + // чтобы строка была корректной + queue[countForQueue] = '\0'; + return queue; +} + +/* + Предполагается, что пользователь вводит корректное арифметическое выражение. + Но в программе предусмотрено, если пользователь забудет одну из скобок. +*/ + +int main() +{ + char* arifmeticExpression = malloc(101 * sizeof(char)); + // 101 так как последний символ отводится для \0 + printf("Введите выражение, не превышающее по длине 100 символов\n"); + fgets(arifmeticExpression, 101, stdin); + char* queue = convertString(arifmeticExpression, strlen(arifmeticExpression)); + for (unsigned i = 0; i <= strlen(queue); i++) { + if (i == 0) { + printf("%c", queue[i]); + + } else if (i == strlen(queue)) { + printf("%c\n", queue[i]); + } else { + printf(" %c ", queue[i]); + } + } + free(arifmeticExpression); + return 0; +} From 563bbe8091ebdf54c9202fe01baa9bc16b5bd10b Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 14 Oct 2025 19:07:41 +0300 Subject: [PATCH 04/16] Remove empty lines --- src/sortingStation.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/sortingStation.c b/src/sortingStation.c index 9836fc6..95ac4d3 100644 --- a/src/sortingStation.c +++ b/src/sortingStation.c @@ -22,7 +22,6 @@ char* convertString(char* string, int len) // не все значения будут идти в очередь, а надо, чтобы элементы в ней располагались один за другим, для этого пусть будет этот счетчик int countForQueue = 0; int i = 0; - while (i != len) { // если число if (isdigit(string[i])) { @@ -46,7 +45,6 @@ char* convertString(char* string, int len) return "ERROR: you missed openning bracket symbol"; } } - // если операторы + - * / if ((string[i] == '+') || (string[i] == '-') || (string[i] == '*') || (string[i] == '/')) { // если оператор, но по приоритету такой же или меньший чем в стеке @@ -89,7 +87,6 @@ int main() for (unsigned i = 0; i <= strlen(queue); i++) { if (i == 0) { printf("%c", queue[i]); - } else if (i == strlen(queue)) { printf("%c\n", queue[i]); } else { From aa47c619cc2932a094fea04d4e40fc7c2f3a120f Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sat, 25 Oct 2025 23:50:03 +0300 Subject: [PATCH 05/16] update stack version in more advanced one --- src/stack.c | 43 ++++++++++++++++++++++++++++++++----------- src/stack.h | 30 +++++++++++++++++------------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/stack.c b/src/stack.c index 5a9c747..4e7ea59 100644 --- a/src/stack.c +++ b/src/stack.c @@ -1,25 +1,41 @@ #include "stack.h" #include +#include -struct Stack newStack(void) + +// структура обыкновенного элемента в стеке +struct StackNode { + int value; + struct StackNode* next; +}; + +// сам стек (структура содержащая указатель на первый элемент стека) +struct Stack { + struct StackNode* head; +}; + + +Stack* newStack(void) { - struct Stack stack = { - .head = NULL - }; + Stack* stack = calloc(1, sizeof(*stack)); return stack; } -void push(struct Stack* stack, int value) +void push(Stack* stack, int value) { - struct StackNode* node = malloc(sizeof(struct StackNode)); + StackNode* node = malloc(sizeof(StackNode)); node->value = value; node->next = stack->head; stack->head = node; } -int pop(struct Stack* stack) +int pop(Stack* stack) { - struct StackNode* oldNode = stack->head; + if (stack->head==NULL) + { + return '\0'; + } + StackNode* oldNode = stack->head; int res = oldNode->value; stack->head = oldNode->next; free(oldNode); @@ -28,14 +44,19 @@ int pop(struct Stack* stack) int peek(struct Stack* stack) { - struct StackNode* headNode = stack->head; + StackNode* headNode = stack->head; int res = headNode->value; return res; } -void deleteStack(struct Stack* stack) +bool isEmpty(Stack* stack) +{ + return stack->head==NULL; +} + +void deleteStack(Stack* stack) { - while (stack->head != NULL) { + while (!isEmpty(stack)) { pop(stack); } } diff --git a/src/stack.h b/src/stack.h index 3945e82..19015b2 100644 --- a/src/stack.h +++ b/src/stack.h @@ -1,29 +1,25 @@ #pragma once +#include + // структура обыкновенного элемента в стеке -struct StackNode { - int value; - struct StackNode* next; -}; +typedef struct StackNode StackNode; // сам стек (структура содержащая указатель на первый элемент стека) -struct Stack { - struct StackNode* head; -}; - +typedef struct Stack Stack; /* * Функция создания "нового стека". * Ничего не принимает. * Возвращает элемент типа struct Stack. * Создает первый элемент в стеке без значения (value), ссылающийся на NULL */ -struct Stack newStack(void); +Stack* newStack(void); /* * Функция, добавляющая новый элемент в стек. * Принимает указатель на последний элемент стека, куда пользователь хочет добавить новый элемент, и его значение типа int. * Ничего не возвращает. */ -void push(struct Stack* stack, int value); +void push(Stack* stack, int value); /* * Pop функция берет элемент из стека и возвращает его значение, @@ -31,13 +27,13 @@ void push(struct Stack* stack, int value); * На вход принимает указатель на последний элемент стека. * Пользователь должен проверить, что он не передает в функцию пустой стек. */ -int pop(struct Stack* stack); +int pop(Stack* stack); /* * Функция peek принимает на вход указатель на последний элемент стека, * возвращает значение, лежащее в последнем элементе стека. */ -int peek(struct Stack* stack); +int peek(Stack* stack); /* * Функция удаления стека (освобождения памяти). @@ -45,4 +41,12 @@ int peek(struct Stack* stack); * Ничего не возвращает. * Перебирает элементы стека и освобождает память, которую они занимают. */ -void deleteStack(struct Stack* stack); +void deleteStack(Stack* stack); + + +/* + * функция проверяет, пустой ли список + * на вход принимает указатель на список + * возвращет булевое значение: true если список пустой, иначе false + */ +bool isEmpty(Stack* stack); From 431a7b185850b229c6b93cb7335c2c3a7baeb611 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sun, 2 Nov 2025 11:44:23 +0300 Subject: [PATCH 06/16] Changed file structure, add dir for sorted station --- .gitignore | 2 +- src/{ => SortingStation}/sortingStation.c | 0 src/{ => SortingStation}/stack.c | 0 src/{ => SortingStation}/stack.h | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename src/{ => SortingStation}/sortingStation.c (100%) rename src/{ => SortingStation}/stack.c (100%) rename src/{ => SortingStation}/stack.h (100%) diff --git a/.gitignore b/.gitignore index b48d248..ef3bbcf 100644 --- a/.gitignore +++ b/.gitignore @@ -54,5 +54,5 @@ modules.order Module.symvers Mkfile.old dkms.conf - +built # End of https://www.toptal.com/developers/gitignore/api/c diff --git a/src/sortingStation.c b/src/SortingStation/sortingStation.c similarity index 100% rename from src/sortingStation.c rename to src/SortingStation/sortingStation.c diff --git a/src/stack.c b/src/SortingStation/stack.c similarity index 100% rename from src/stack.c rename to src/SortingStation/stack.c diff --git a/src/stack.h b/src/SortingStation/stack.h similarity index 100% rename from src/stack.h rename to src/SortingStation/stack.h From 223c5da524b6c3d31626a28fec0802f7c24d179b Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sun, 2 Nov 2025 11:54:01 +0300 Subject: [PATCH 07/16] Add 2 cmake files --- CMakeLists.txt | 5 +++++ src/SortingStation/CMakeLists.txt | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 src/SortingStation/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5a1c338 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.25) + +progect(C_Homework) + +add_subdirectory(src/SortingStation) diff --git a/src/SortingStation/CMakeLists.txt b/src/SortingStation/CMakeLists.txt new file mode 100644 index 0000000..68ee304 --- /dev/null +++ b/src/SortingStation/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(sortingStation sortingStation.c) + +add_library(stack stack.c) + +target_link(sortingStation PRIVATE stack) From 605ac32bfdcd7afad88b1af4723cc9cfb2b59c1b Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sun, 2 Nov 2025 11:57:26 +0300 Subject: [PATCH 08/16] final changes --- CMakeLists.txt | 2 +- src/SortingStation/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a1c338..7bd376c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -progect(C_Homework) +project(C_Homework) add_subdirectory(src/SortingStation) diff --git a/src/SortingStation/CMakeLists.txt b/src/SortingStation/CMakeLists.txt index 68ee304..ed41c63 100644 --- a/src/SortingStation/CMakeLists.txt +++ b/src/SortingStation/CMakeLists.txt @@ -2,4 +2,4 @@ add_executable(sortingStation sortingStation.c) add_library(stack stack.c) -target_link(sortingStation PRIVATE stack) +target_link_libraries(sortingStation PRIVATE stack) From c9615ee03dff546cfa104c429bbd296cd982cf9d Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Sun, 2 Nov 2025 12:18:54 +0300 Subject: [PATCH 09/16] Add flags to the main Cmake file --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7bd376c..2ed5690 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,3 +3,5 @@ cmake_minimum_required(VERSION 3.25) project(C_Homework) add_subdirectory(src/SortingStation) + +add_compile_options(-Wall -Wextra -Wpedantic) From ca673b6ab53ca1a0c8f7c439e468a4d120fbda60 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 25 Nov 2025 17:46:19 +0300 Subject: [PATCH 10/16] Add clang-format config --- .clang-format | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..e2cbc59 --- /dev/null +++ b/.clang-format @@ -0,0 +1,245 @@ +--- +Language: Cpp +# BasedOnStyle: WebKit +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: WebKit +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: Inner +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: true +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... \ No newline at end of file From 2ede7dada782066de2d88d1d96c2a50c20c29a63 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 25 Nov 2025 17:53:46 +0300 Subject: [PATCH 11/16] Fix mistakes in stack.h and stack.c --- src/stack.c | 14 +++++--------- src/stack.h | 29 ++++++++++++----------------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/stack.c b/src/stack.c index 4e7ea59..93670a9 100644 --- a/src/stack.c +++ b/src/stack.c @@ -1,9 +1,10 @@ #include "stack.h" -#include #include - +#include // структура обыкновенного элемента в стеке +typedef struct StackNode StackNode; + struct StackNode { int value; struct StackNode* next; @@ -14,7 +15,6 @@ struct Stack { struct StackNode* head; }; - Stack* newStack(void) { Stack* stack = calloc(1, sizeof(*stack)); @@ -31,8 +31,7 @@ void push(Stack* stack, int value) int pop(Stack* stack) { - if (stack->head==NULL) - { + if (stack->head == NULL) { return '\0'; } StackNode* oldNode = stack->head; @@ -49,10 +48,7 @@ int peek(struct Stack* stack) return res; } -bool isEmpty(Stack* stack) -{ - return stack->head==NULL; -} +bool isEmpty(Stack* stack) { return stack->head == NULL; } void deleteStack(Stack* stack) { diff --git a/src/stack.h b/src/stack.h index 19015b2..6914c71 100644 --- a/src/stack.h +++ b/src/stack.h @@ -1,52 +1,47 @@ #pragma once #include -// структура обыкновенного элемента в стеке -typedef struct StackNode StackNode; - // сам стек (структура содержащая указатель на первый элемент стека) typedef struct Stack Stack; + /* * Функция создания "нового стека". * Ничего не принимает. - * Возвращает элемент типа struct Stack. - * Создает первый элемент в стеке без значения (value), ссылающийся на NULL + * Возвращает указатель на созданный стек. */ Stack* newStack(void); /* * Функция, добавляющая новый элемент в стек. - * Принимает указатель на последний элемент стека, куда пользователь хочет добавить новый элемент, и его значение типа int. + * Принимает указатель на стек и значение типа int * Ничего не возвращает. */ void push(Stack* stack, int value); /* - * Pop функция берет элемент из стека и возвращает его значение, - * при этом элемент больше не находится в стеке. - * На вход принимает указатель на последний элемент стека. - * Пользователь должен проверить, что он не передает в функцию пустой стек. + * Функция извлечения элемента из стека. + * Принимает указатель на стек + * Возвращает значение из вершины стека и удаляет элемент. */ int pop(Stack* stack); /* - * Функция peek принимает на вход указатель на последний элемент стека, - * возвращает значение, лежащее в последнем элементе стека. + * Функция peek принимает на вход указатель на стек, + * Возвращает значение из вершины стека */ int peek(Stack* stack); /* * Функция удаления стека (освобождения памяти). - * На вход принимает указатель на последний элемент стека. + * На вход принимает указатель на стек. * Ничего не возвращает. * Перебирает элементы стека и освобождает память, которую они занимают. */ void deleteStack(Stack* stack); - /* - * функция проверяет, пустой ли список - * на вход принимает указатель на список - * возвращет булевое значение: true если список пустой, иначе false + * функция проверяет, пустой ли стек + * на вход принимает указатель на стек + * возвращет булевое значение: true если стек пустой, иначе false */ bool isEmpty(Stack* stack); From 6a2b7e5844db3fdfaa71fb4fb3293272e2d1c8fd Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 25 Nov 2025 18:04:27 +0300 Subject: [PATCH 12/16] Fix other mistakes in stack.c add built in .gitignore --- .clang-format | 3 +-- .gitignore | 2 +- src/stack.c | 4 +--- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.clang-format b/.clang-format index e2cbc59..84ea374 100644 --- a/.clang-format +++ b/.clang-format @@ -241,5 +241,4 @@ WhitespaceSensitiveMacros: - CF_SWIFT_NAME - NS_SWIFT_NAME - PP_STRINGIZE - - STRINGIZE -... \ No newline at end of file + - STRINGIZE \ No newline at end of file diff --git a/.gitignore b/.gitignore index b48d248..ef3bbcf 100644 --- a/.gitignore +++ b/.gitignore @@ -54,5 +54,5 @@ modules.order Module.symvers Mkfile.old dkms.conf - +built # End of https://www.toptal.com/developers/gitignore/api/c diff --git a/src/stack.c b/src/stack.c index 93670a9..d2a54ad 100644 --- a/src/stack.c +++ b/src/stack.c @@ -31,9 +31,6 @@ void push(Stack* stack, int value) int pop(Stack* stack) { - if (stack->head == NULL) { - return '\0'; - } StackNode* oldNode = stack->head; int res = oldNode->value; stack->head = oldNode->next; @@ -55,4 +52,5 @@ void deleteStack(Stack* stack) while (!isEmpty(stack)) { pop(stack); } + free(stack); } From b214c45121823e0d124077136902c8ea023185f8 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 25 Nov 2025 19:51:40 +0300 Subject: [PATCH 13/16] Fix all mistakes --- src/SortingStation/sortingStation.c | 86 +++++++++++++++-------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/src/SortingStation/sortingStation.c b/src/SortingStation/sortingStation.c index 95ac4d3..2fc66ab 100644 --- a/src/SortingStation/sortingStation.c +++ b/src/SortingStation/sortingStation.c @@ -5,7 +5,7 @@ #include // функция для определения приоритета операнда +- это 1, * / это 2 -int getPreoritite(char operand) +int getPriority(char operand) { if (operand == '+' || operand == '-') { return 1; @@ -17,58 +17,64 @@ int getPreoritite(char operand) char* convertString(char* string, int len) { - struct Stack stack = newStack(); - char* queue = malloc(101 * sizeof(char)); - // не все значения будут идти в очередь, а надо, чтобы элементы в ней располагались один за другим, для этого пусть будет этот счетчик - int countForQueue = 0; + struct Stack* stack = newStack(); + char* queue = malloc(1000 * sizeof(char)); + int queueEndPtr = 0; int i = 0; while (i != len) { // если число if (isdigit(string[i])) { - queue[countForQueue] = string[i]; - ++countForQueue; + queue[queueEndPtr] = string[i]; + ++queueEndPtr; + queue[queueEndPtr] = ' '; + ++queueEndPtr; } // если открывающаяся скобка, добавляем ее в стек if (string[i] == '(') { - push(&stack, string[i]); + push(stack, string[i]); } // если закрывающаяся, то переберем все значения стека и разместим их в очереди, пока не встретится открывающая скобка else if (string[i] == ')') { - while ((stack.head != NULL) && (peek(&stack) != '(')) { - queue[countForQueue] = pop(&stack); - ++countForQueue; + while ((!isEmpty(stack)) && (peek(stack) != '(')) { + queue[queueEndPtr] = pop(stack); + ++queueEndPtr; + queue[queueEndPtr] = ' '; + ++queueEndPtr; } - if ((stack.head != NULL) && (peek(&stack) == '(')) { - pop(&stack); - } else if (stack.head == NULL) { - deleteStack(&stack); + if ((!isEmpty(stack)) && (peek(stack) == '(')) { + pop(stack); + } else if (!isEmpty(stack)) { + deleteStack(stack); return "ERROR: you missed openning bracket symbol"; } } // если операторы + - * / if ((string[i] == '+') || (string[i] == '-') || (string[i] == '*') || (string[i] == '/')) { // если оператор, но по приоритету такой же или меньший чем в стеке - while ((stack.head != NULL) && (getPreoritite(string[i]) <= getPreoritite(peek(&stack)))) { - queue[countForQueue] = pop(&stack); - ++countForQueue; + while ((!isEmpty(stack)) && (getPriority(string[i]) <= getPriority(peek(stack)))) { + queue[queueEndPtr] = pop(stack); + ++queueEndPtr; + queue[queueEndPtr] = ' '; + ++queueEndPtr; } - push(&stack, string[i]); + push(stack, string[i]); } ++i; } - if (stack.head != NULL) { - while (stack.head != NULL) { - if (peek(&stack) == '(') { - deleteStack(&stack); - return "ERROR: you missed closing bracket symbol"; - } - queue[countForQueue] = pop(&stack); - ++countForQueue; + while (!isEmpty(stack)) { + if (peek(stack) == '(') { + deleteStack(stack); + return "ERROR: you missed closing bracket symbol"; } + queue[queueEndPtr] = pop(stack); + ++queueEndPtr; + queue[queueEndPtr] = ' '; + ++queueEndPtr; } - deleteStack(&stack); + + deleteStack(stack); // чтобы строка была корректной - queue[countForQueue] = '\0'; + queue[queueEndPtr] = '\0'; return queue; } @@ -79,20 +85,18 @@ char* convertString(char* string, int len) int main() { - char* arifmeticExpression = malloc(101 * sizeof(char)); - // 101 так как последний символ отводится для \0 - printf("Введите выражение, не превышающее по длине 100 символов\n"); - fgets(arifmeticExpression, 101, stdin); + char* arifmeticExpression = malloc(1001 * sizeof(char)); + // 1001 так как последний символ отводится для \0 + printf("Введите выражение, не превышающее по длине 1001 символов\n"); + fgets(arifmeticExpression, 1001, stdin); char* queue = convertString(arifmeticExpression, strlen(arifmeticExpression)); - for (unsigned i = 0; i <= strlen(queue); i++) { - if (i == 0) { - printf("%c", queue[i]); - } else if (i == strlen(queue)) { - printf("%c\n", queue[i]); - } else { - printf(" %c ", queue[i]); + int queueLength = strlen(queue); + for (unsigned i = 0; i <= queueLength; i++) { + printf("%c", queue[i]); + if (i == strlen(queue)) { + printf("\n"); } } free(arifmeticExpression); return 0; -} +} \ No newline at end of file From 7f3b850729403406687548e1de6bfc902156f306 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 25 Nov 2025 20:12:47 +0300 Subject: [PATCH 14/16] Fix some small mistakes --- src/SortingStation/stack.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SortingStation/stack.h b/src/SortingStation/stack.h index 6914c71..9a53d07 100644 --- a/src/SortingStation/stack.h +++ b/src/SortingStation/stack.h @@ -22,6 +22,8 @@ void push(Stack* stack, int value); * Функция извлечения элемента из стека. * Принимает указатель на стек * Возвращает значение из вершины стека и удаляет элемент. + * Ответственность за поведение программы при пустом стеке и попытке сделать + * к нему pop лежит на пользователе */ int pop(Stack* stack); From e55babfe345fc2fd4a81ab8620d68cf0e1e985f5 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 9 Dec 2025 08:01:22 +0300 Subject: [PATCH 15/16] Fix all mistakes that teacher gave me --- src/SortingStation/sortingStation.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/SortingStation/sortingStation.c b/src/SortingStation/sortingStation.c index 2fc66ab..b5e8bb6 100644 --- a/src/SortingStation/sortingStation.c +++ b/src/SortingStation/sortingStation.c @@ -15,10 +15,11 @@ int getPriority(char operand) return 0; } -char* convertString(char* string, int len) +char* convertString(char* string) { struct Stack* stack = newStack(); char* queue = malloc(1000 * sizeof(char)); + int len = strlen(string); int queueEndPtr = 0; int i = 0; while (i != len) { @@ -75,7 +76,9 @@ char* convertString(char* string, int len) deleteStack(stack); // чтобы строка была корректной queue[queueEndPtr] = '\0'; - return queue; + char* queue_realloced = realloc(queue, sizeof(char) * (strlen(queue) + 1)); + free(stack); + return queue_realloced; } /* @@ -89,14 +92,10 @@ int main() // 1001 так как последний символ отводится для \0 printf("Введите выражение, не превышающее по длине 1001 символов\n"); fgets(arifmeticExpression, 1001, stdin); - char* queue = convertString(arifmeticExpression, strlen(arifmeticExpression)); + char* queue = convertString(arifmeticExpression); int queueLength = strlen(queue); - for (unsigned i = 0; i <= queueLength; i++) { - printf("%c", queue[i]); - if (i == strlen(queue)) { - printf("\n"); - } - } + printf("%s\n", queue); + free(queue); free(arifmeticExpression); return 0; } \ No newline at end of file From ea16d9f8b3311ea024475e86e5204826de00a7f5 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Tue, 9 Dec 2025 08:11:49 +0300 Subject: [PATCH 16/16] compile to comspile in gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ef3bbcf..83fa168 100644 --- a/.gitignore +++ b/.gitignore @@ -46,7 +46,7 @@ *.idb *.pdb -# Kernel Module Compile Results +# Kernel Module Comspile Results *.mod* *.cmd .tmp_versions/