From 832a2d986586b9a350cd464cfb167769d0cc3300 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sat, 20 Dec 2025 23:02:25 +0300 Subject: [PATCH 01/12] Create stack.c --- src/hw5_stack/stack.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/hw5_stack/stack.c diff --git a/src/hw5_stack/stack.c b/src/hw5_stack/stack.c new file mode 100644 index 0000000..826ee07 --- /dev/null +++ b/src/hw5_stack/stack.c @@ -0,0 +1,31 @@ +#include "stack.h" + +// Создаем стэк, делая значение top равным -1 ("нет элементов") +void init_stack(Stack *stack) { + stack->topIndex = -1; +} + +// Добавляем элемент +void push(Stack *stack, char value) { + stack->topIndex++; // Увеличиваем индекс на 1 + stack->elements[stack->topIndex] = value; // Добавляем сам элемент в массив +} + +// Берем верхний элемент и удаляем его +char pop(Stack *stack) { + if (StackEmptiness(stack)) { // Проверяем не пуст ли стек + return '\0'; // Возвращаем '\0' если пуст (в таком виде, потому что нужно вернуть char) + } + char value = stack->elements[stack->topIndex]; // Сохраняем верхний элемент + stack->topIndex--; // Уменьшаем индекс + return value; // Возвращаем сохраненный элемент +} + +// Проверяем пуст ли стек (Чтоб не убрать "пустоту") +int StackEmptiness(Stack *stack) { + if (stack->topIndex == -1) { + return 1; // 1 - стек пуст + } else { + return 0; // 0 - стек не пуст + } +} From 3b859ff978922a1a5c4039f62852b0195ab75fb4 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sat, 20 Dec 2025 23:05:55 +0300 Subject: [PATCH 02/12] Create stack.h --- src/hw5_stack/stack.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/hw5_stack/stack.h diff --git a/src/hw5_stack/stack.h b/src/hw5_stack/stack.h new file mode 100644 index 0000000..9d61041 --- /dev/null +++ b/src/hw5_stack/stack.h @@ -0,0 +1,41 @@ +// Description: Этот модуль предоставляет функции для работы со стеком: +// создание стэка (init_stack), добавление (push), извлечение элементов (pop) и проверка на пустоту (is_empty). +// Нужен для двух задач: Продвинутый баланс скобок и Сортировочная станция +// +#pragma once +#define STACK_SIZE 512 + +// +// Структура для стека +// В ней создаем char массив для хранения элементов длины STACK_SIZE и переменную для хранения индекса верхнего элемента +// +typedef struct { + char elements[STACK_SIZE]; // массив для хранения + int topIndex; // индекс верхнего элемента +} Stack; + +// +// Создание стека +// В качестве параметра берем указатель на стек (для изменения самого стека, а не только копии) +// +void init_stack(Stack *stack); + +// +// Добавление элемента в стек +// Параметр - Указатель на стек и значение элемента для добавления +// +void push(Stack *stack, char value); + +// +// Удаление элемента из стека с проверкой на пустоту +// Параметр - Указатель на стек +// Вернет значение элемента, если есть что удалять, и 0 если нет +// +char pop(Stack *stack); + +// +// Проверка стэка на пустоту +// Параметр - Указатель на стек +// Вернет 1 если стек пуст, 0 если нет +// +int is_empty(Stack *stack); From 3c0c341bf4a7e370d8f48421cba21478ecf1949b Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sat, 20 Dec 2025 23:08:11 +0300 Subject: [PATCH 03/12] =?UTF-8?q?Create=20complexParenthese.=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "src/hw5_stack/complexParenthese.\321\201" | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 "src/hw5_stack/complexParenthese.\321\201" diff --git "a/src/hw5_stack/complexParenthese.\321\201" "b/src/hw5_stack/complexParenthese.\321\201" new file mode 100644 index 0000000..ca14a32 --- /dev/null +++ "b/src/hw5_stack/complexParenthese.\321\201" @@ -0,0 +1,49 @@ +#include "complexParenthese.h" + +#include +#include +#include "stack.h" + +int checkBrackets(char str[]) +{ + Stack stack; + init_stack(&stack); + + for (int i = 0; str[i] != '\0'; i++) { // Идем с первого символа строки до последнего, который в С \0 + + if (str[i] == '(' || str[i] == '[' || str[i] == '{') { + push(&stack, str[i]); // Если встретилась открывающаяся скобка, то добавляем в стэк + } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { + if (StackEmptiness(&stack)) { + return 0; // Обрабатываем случай, когда одна закрывающая и без открывающих + } + char lastElem = pop(&stack); // Достаем прошлый элемент стэка + + // проверяем соответствие скобок (они должны быть одного вида, если встретилась закрывающаяся) + if ((lastElem == '(' && str[i] != ')') || (lastElem == '[' && str[i] != ']') || (lastElem == '{' && str[i] != '}')) { + return 0; + } + // Если, например, встретились last == '{' и str[i] == '}', то все верно, идем дальше. + // В стэк не добавляется новый элемент, а прошлый удаляется через pop + } + } + return StackEmptiness(&stack); // если стек пуст, то все скобки проверены, и раз стэк не вернул 0, то строка сбалансирована +} + +int main() +{ + char str[1000]; // Фиксированный размер массива + + printf("Введите строку: "); + + fgets(str, sizeof(str), stdin); + str[strlen(str) - 1] = '\0'; + + if (checkBrackets(str)) { + printf("Сбалансирована\n"); + } else { + printf("Не слабалансирована\n"); + } + + return 0; +} From 452a1289b65ff46d32be76a5224886c29daf9faa Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sat, 20 Dec 2025 23:09:27 +0300 Subject: [PATCH 04/12] Create complexParenthese.h --- src/hw5_stack/complexParenthese.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/hw5_stack/complexParenthese.h diff --git a/src/hw5_stack/complexParenthese.h b/src/hw5_stack/complexParenthese.h new file mode 100644 index 0000000..8505515 --- /dev/null +++ b/src/hw5_stack/complexParenthese.h @@ -0,0 +1,24 @@ +#pragma once + +// +// File: complexParenthese.h +// Author: Alexandra Dolzhenko +// +// Description: Этот модуль предоставляет функцию для проверки баланса скобок трех видов: +// круглые (), квадратные [], фигурные {}. Использует стек для проверки правильной вложенности. +// Скобочная последовательность вида ({)} считается некорректной, ({}) — корректной по условию задачи +// + +// +// Проверка баланса скобок в строке +// Параметр: str - строка для проверки +// Возвращает: 1 если скобки сбалансированы, 0 если нет. Пользователю высвечивается "Строка сбалансирована" и "Строка несбалансирована" +// +// Алгоритм: +// 1. Проходим по каждому символу строки +// 2. Открывающие скобки добавляем в стек +// 3. При встрече закрывающей скобки проверяем соответствие с последней открывающей из стека. +// 4. Если вид соответствует, то закрывающую не добавляем, а прошлую открывающую удаляем. Если нет - возвращаем 0 и заканчиваем. +// 5. Если все скобки закрыты и стек пуст - последовательность сбалансирована +// +int checkBrackets(char str[]); From d877c80378e62310dd69fce6402f3e15b460c6cc Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sat, 20 Dec 2025 23:12:37 +0300 Subject: [PATCH 05/12] Create CMakeLists.txt --- src/hw5_stack/CMakeLists.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/hw5_stack/CMakeLists.txt diff --git a/src/hw5_stack/CMakeLists.txt b/src/hw5_stack/CMakeLists.txt new file mode 100644 index 0000000..420a2c7 --- /dev/null +++ b/src/hw5_stack/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 4.0) +project(hw5_stack C) + +set(CMAKE_C_STANDARD 17) + +include_directories( + src/hw5_stack +) + +add_executable(complex_parentheses + src/hw5_stack/complexParenthese.c + src/hw5_stack/complexParenthese.h + src/hw5_stack/stack.c + src/hw5_stack/stack.h +) From 27769555ff80dadab2027f5d19735156a41de1e2 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sun, 21 Dec 2025 12:35:02 +0300 Subject: [PATCH 06/12] Fixed CMakeLists.txt --- src/hw5_stack/CMakeLists.txt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/hw5_stack/CMakeLists.txt b/src/hw5_stack/CMakeLists.txt index 420a2c7..fbcf084 100644 --- a/src/hw5_stack/CMakeLists.txt +++ b/src/hw5_stack/CMakeLists.txt @@ -1,15 +1,13 @@ -cmake_minimum_required(VERSION 4.0) +cmake_minimum_required(VERSION 3.16) project(hw5_stack C) set(CMAKE_C_STANDARD 17) -include_directories( - src/hw5_stack +add_executable(hw5_stack + complexParenthese.c + stack.c ) -add_executable(complex_parentheses - src/hw5_stack/complexParenthese.c - src/hw5_stack/complexParenthese.h - src/hw5_stack/stack.c - src/hw5_stack/stack.h -) +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(hw5_stack PRIVATE -Wall -Wextra -Wpedantic) +endif() From a9cc564318e3d2b00a742d200967e59739d01cb6 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Sun, 21 Dec 2025 12:42:37 +0300 Subject: [PATCH 07/12] Update CMakeLists.txt --- src/hw5_stack/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hw5_stack/CMakeLists.txt b/src/hw5_stack/CMakeLists.txt index fbcf084..85df270 100644 --- a/src/hw5_stack/CMakeLists.txt +++ b/src/hw5_stack/CMakeLists.txt @@ -3,7 +3,7 @@ project(hw5_stack C) set(CMAKE_C_STANDARD 17) -add_executable(hw5_stack +add_executable(complexParenthese complexParenthese.c stack.c ) From 6d3aabcf695a4e239072d0a691bcb7c5e6082f8e Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 26 Dec 2025 00:56:35 +0300 Subject: [PATCH 08/12] Remove text in complexParenthese.h --- src/hw5_stack/complexParenthese.h | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/hw5_stack/complexParenthese.h b/src/hw5_stack/complexParenthese.h index 8505515..e76db32 100644 --- a/src/hw5_stack/complexParenthese.h +++ b/src/hw5_stack/complexParenthese.h @@ -1,24 +1,4 @@ #pragma once - -// -// File: complexParenthese.h -// Author: Alexandra Dolzhenko -// -// Description: Этот модуль предоставляет функцию для проверки баланса скобок трех видов: +// Этот модуль предоставляет функцию для проверки баланса скобок трех видов: // круглые (), квадратные [], фигурные {}. Использует стек для проверки правильной вложенности. -// Скобочная последовательность вида ({)} считается некорректной, ({}) — корректной по условию задачи -// - -// -// Проверка баланса скобок в строке -// Параметр: str - строка для проверки -// Возвращает: 1 если скобки сбалансированы, 0 если нет. Пользователю высвечивается "Строка сбалансирована" и "Строка несбалансирована" -// -// Алгоритм: -// 1. Проходим по каждому символу строки -// 2. Открывающие скобки добавляем в стек -// 3. При встрече закрывающей скобки проверяем соответствие с последней открывающей из стека. -// 4. Если вид соответствует, то закрывающую не добавляем, а прошлую открывающую удаляем. Если нет - возвращаем 0 и заканчиваем. -// 5. Если все скобки закрыты и стек пуст - последовательность сбалансирована -// int checkBrackets(char str[]); From f62228d9946c5d8828f31d9388594182d6fff24b Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 26 Dec 2025 00:57:26 +0300 Subject: [PATCH 09/12] Style fix in complexParenthese.c --- src/hw5_stack/complexParenthese.c | 51 ++++++++++++++++++++++ "src/hw5_stack/complexParenthese.\321\201" | 49 --------------------- 2 files changed, 51 insertions(+), 49 deletions(-) create mode 100644 src/hw5_stack/complexParenthese.c delete mode 100644 "src/hw5_stack/complexParenthese.\321\201" diff --git a/src/hw5_stack/complexParenthese.c b/src/hw5_stack/complexParenthese.c new file mode 100644 index 0000000..bfb2a32 --- /dev/null +++ b/src/hw5_stack/complexParenthese.c @@ -0,0 +1,51 @@ +#include "complexParenthese.h" + +#include +#include +#include "stack.h" + +int checkBrackets(char str[]) +{ + Stack stack; + init_stack(&stack); + + for (int i = 0; str[i] != '\0'; i++) { + if (str[i] == '(' + || str[i] == '[' + || str[i] == '{') { + push(&stack, str[i]); + } else if (str[i] == ')' + || str[i] == ']' + || str[i] == '}') { + if (stackEmptiness(&stack)) { + return 0; // Обрабатываем случай, когда одна закрывающая и без открывающих + } + char lastElem = pop(&stack); + + // проверяем соответствие скобок (они должны быть одного вида, если встретилась закрывающаяся) + if ((lastElem == '(' && str[i] != ')') + || (lastElem == '[' && str[i] != ']') + || (lastElem == '{' && str[i] != '}')) + return 0; + // Если, например, встретились last == '{' и str[i] == '}', то все верно, идем дальше. + // В стек не добавляется новый элемент, а прошлый удаляется через pop + } + } + return stackEmptiness(&stack); +} + +int main() +{ + char str[1000]; + printf("Введите строку: "); + fgets(str, sizeof(str), stdin); + str[strlen(str) - 1] = '\0'; + + if (checkBrackets(str)) { + printf("Сбалансирована!\n"); + } else { + printf("Неслабалансирована\n"); + } + + return 0; +} diff --git "a/src/hw5_stack/complexParenthese.\321\201" "b/src/hw5_stack/complexParenthese.\321\201" deleted file mode 100644 index ca14a32..0000000 --- "a/src/hw5_stack/complexParenthese.\321\201" +++ /dev/null @@ -1,49 +0,0 @@ -#include "complexParenthese.h" - -#include -#include -#include "stack.h" - -int checkBrackets(char str[]) -{ - Stack stack; - init_stack(&stack); - - for (int i = 0; str[i] != '\0'; i++) { // Идем с первого символа строки до последнего, который в С \0 - - if (str[i] == '(' || str[i] == '[' || str[i] == '{') { - push(&stack, str[i]); // Если встретилась открывающаяся скобка, то добавляем в стэк - } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { - if (StackEmptiness(&stack)) { - return 0; // Обрабатываем случай, когда одна закрывающая и без открывающих - } - char lastElem = pop(&stack); // Достаем прошлый элемент стэка - - // проверяем соответствие скобок (они должны быть одного вида, если встретилась закрывающаяся) - if ((lastElem == '(' && str[i] != ')') || (lastElem == '[' && str[i] != ']') || (lastElem == '{' && str[i] != '}')) { - return 0; - } - // Если, например, встретились last == '{' и str[i] == '}', то все верно, идем дальше. - // В стэк не добавляется новый элемент, а прошлый удаляется через pop - } - } - return StackEmptiness(&stack); // если стек пуст, то все скобки проверены, и раз стэк не вернул 0, то строка сбалансирована -} - -int main() -{ - char str[1000]; // Фиксированный размер массива - - printf("Введите строку: "); - - fgets(str, sizeof(str), stdin); - str[strlen(str) - 1] = '\0'; - - if (checkBrackets(str)) { - printf("Сбалансирована\n"); - } else { - printf("Не слабалансирована\n"); - } - - return 0; -} From e7f8af6c42e4cdffbe1ecd389695f7790da16b89 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 26 Dec 2025 00:58:48 +0300 Subject: [PATCH 10/12] Style fix in complexParenthese.c --- src/hw5_stack/complexParenthese.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hw5_stack/complexParenthese.c b/src/hw5_stack/complexParenthese.c index bfb2a32..d49d06d 100644 --- a/src/hw5_stack/complexParenthese.c +++ b/src/hw5_stack/complexParenthese.c @@ -26,9 +26,8 @@ int checkBrackets(char str[]) if ((lastElem == '(' && str[i] != ')') || (lastElem == '[' && str[i] != ']') || (lastElem == '{' && str[i] != '}')) - return 0; - // Если, например, встретились last == '{' и str[i] == '}', то все верно, идем дальше. - // В стек не добавляется новый элемент, а прошлый удаляется через pop + // В стек не добавляется новый элемент, а прошлый удаляется через pop + return 0; } } return stackEmptiness(&stack); From 668ad50ba0517383e873baad8ef7ac1bb0da7988 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 26 Dec 2025 01:00:08 +0300 Subject: [PATCH 11/12] =?UTF-8?q?Changed=20"=D1=81=D1=82=D1=8D=D0=BA"=20to?= =?UTF-8?q?=20"=D1=81=D1=82=D0=B5=D0=BA"=20stack.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hw5_stack/stack.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hw5_stack/stack.c b/src/hw5_stack/stack.c index 826ee07..6f15f12 100644 --- a/src/hw5_stack/stack.c +++ b/src/hw5_stack/stack.c @@ -1,6 +1,6 @@ #include "stack.h" -// Создаем стэк, делая значение top равным -1 ("нет элементов") +// Создаем стек, делая значение top равным -1 ("нет элементов") void init_stack(Stack *stack) { stack->topIndex = -1; } @@ -13,7 +13,7 @@ void push(Stack *stack, char value) { // Берем верхний элемент и удаляем его char pop(Stack *stack) { - if (StackEmptiness(stack)) { // Проверяем не пуст ли стек + if (stackEmptiness(stack)) { // Проверяем не пуст ли стек return '\0'; // Возвращаем '\0' если пуст (в таком виде, потому что нужно вернуть char) } char value = stack->elements[stack->topIndex]; // Сохраняем верхний элемент @@ -22,7 +22,7 @@ char pop(Stack *stack) { } // Проверяем пуст ли стек (Чтоб не убрать "пустоту") -int StackEmptiness(Stack *stack) { +int stackEmptiness(Stack *stack) { if (stack->topIndex == -1) { return 1; // 1 - стек пуст } else { From d7c0ae6be6f83a0afc4cbc1f77338e70f6f76b73 Mon Sep 17 00:00:00 2001 From: DolzhenkoAlexa Date: Fri, 26 Dec 2025 01:05:18 +0300 Subject: [PATCH 12/12] Remove text in stack.h --- src/hw5_stack/stack.h | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/hw5_stack/stack.h b/src/hw5_stack/stack.h index 9d61041..517dd1b 100644 --- a/src/hw5_stack/stack.h +++ b/src/hw5_stack/stack.h @@ -1,41 +1,23 @@ -// Description: Этот модуль предоставляет функции для работы со стеком: -// создание стэка (init_stack), добавление (push), извлечение элементов (pop) и проверка на пустоту (is_empty). -// Нужен для двух задач: Продвинутый баланс скобок и Сортировочная станция -// +// Этот модуль предоставляет функции для работы со стеком для Продвинутый баланс скобок и Сортировочная станция: #pragma once #define STACK_SIZE 512 -// // Структура для стека -// В ней создаем char массив для хранения элементов длины STACK_SIZE и переменную для хранения индекса верхнего элемента -// typedef struct { char elements[STACK_SIZE]; // массив для хранения int topIndex; // индекс верхнего элемента } Stack; -// // Создание стека -// В качестве параметра берем указатель на стек (для изменения самого стека, а не только копии) -// void init_stack(Stack *stack); -// // Добавление элемента в стек -// Параметр - Указатель на стек и значение элемента для добавления -// void push(Stack *stack, char value); -// // Удаление элемента из стека с проверкой на пустоту -// Параметр - Указатель на стек // Вернет значение элемента, если есть что удалять, и 0 если нет -// char pop(Stack *stack); -// // Проверка стэка на пустоту -// Параметр - Указатель на стек // Вернет 1 если стек пуст, 0 если нет -// -int is_empty(Stack *stack); +int stackEmptiness(Stack *stack);