diff --git a/src/hw5_stack/CMakeLists.txt b/src/hw5_stack/CMakeLists.txt new file mode 100644 index 0000000..85df270 --- /dev/null +++ b/src/hw5_stack/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.16) +project(hw5_stack C) + +set(CMAKE_C_STANDARD 17) + +add_executable(complexParenthese + complexParenthese.c + stack.c +) + +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(hw5_stack PRIVATE -Wall -Wextra -Wpedantic) +endif() diff --git a/src/hw5_stack/complexParenthese.c b/src/hw5_stack/complexParenthese.c new file mode 100644 index 0000000..d49d06d --- /dev/null +++ b/src/hw5_stack/complexParenthese.c @@ -0,0 +1,50 @@ +#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] != '}')) + // В стек не добавляется новый элемент, а прошлый удаляется через pop + return 0; + } + } + 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.h b/src/hw5_stack/complexParenthese.h new file mode 100644 index 0000000..e76db32 --- /dev/null +++ b/src/hw5_stack/complexParenthese.h @@ -0,0 +1,4 @@ +#pragma once +// Этот модуль предоставляет функцию для проверки баланса скобок трех видов: +// круглые (), квадратные [], фигурные {}. Использует стек для проверки правильной вложенности. +int checkBrackets(char str[]); diff --git a/src/hw5_stack/stack.c b/src/hw5_stack/stack.c new file mode 100644 index 0000000..6f15f12 --- /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 - стек не пуст + } +} diff --git a/src/hw5_stack/stack.h b/src/hw5_stack/stack.h new file mode 100644 index 0000000..517dd1b --- /dev/null +++ b/src/hw5_stack/stack.h @@ -0,0 +1,23 @@ +// Этот модуль предоставляет функции для работы со стеком для Продвинутый баланс скобок и Сортировочная станция: +#pragma once +#define STACK_SIZE 512 + +// Структура для стека +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 stackEmptiness(Stack *stack);