Skip to content
13 changes: 13 additions & 0 deletions src/hw5_stack/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
50 changes: 50 additions & 0 deletions src/hw5_stack/complexParenthese.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include "complexParenthese.h"

#include <stdio.h>
#include <string.h>
#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;
}
4 changes: 4 additions & 0 deletions src/hw5_stack/complexParenthese.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#pragma once
// Этот модуль предоставляет функцию для проверки баланса скобок трех видов:
// круглые (), квадратные [], фигурные {}. Использует стек для проверки правильной вложенности.
int checkBrackets(char str[]);
31 changes: 31 additions & 0 deletions src/hw5_stack/stack.c
Original file line number Diff line number Diff line change
@@ -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 - стек не пуст
}
}
23 changes: 23 additions & 0 deletions src/hw5_stack/stack.h
Original file line number Diff line number Diff line change
@@ -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);