diff --git a/src/hw_5-1_proBrackets/README.md b/src/hw_5-1_proBrackets/README.md new file mode 100644 index 0000000..374d136 --- /dev/null +++ b/src/hw_5-1_proBrackets/README.md @@ -0,0 +1,19 @@ +# Инструкция по сборке + +Домашнее задание 5.1 Продвинутый баланс скобок + +1. Откройте терминал и перейдите в директорию с файлами приложения (hw_5-1_proBrackets) +2. Выполните команду компиляции: +```console +gcc hw_5-1_proBrackets.c ../stack/stack.c -I.. -o hw_5-1_proBrackets +``` +3. Запустите программу: +```console +./hw_5-1_proBrackets +``` +### Использование +1. Введите строку, состоящую из скобок (не более 100 символов) +2. Нажмите Enter для завершения ввода + +3. Программа выведет, корректно ли расположение скобок + diff --git a/src/hw_5-1_proBrackets/hw_5-1_proBrackets.c b/src/hw_5-1_proBrackets/hw_5-1_proBrackets.c new file mode 100644 index 0000000..a6225ff --- /dev/null +++ b/src/hw_5-1_proBrackets/hw_5-1_proBrackets.c @@ -0,0 +1,48 @@ +#include "hw_5-1_proBrackets/hw_5-1_proBrackets.h" +#include "stack/stack.h" +#include +#include + +int isValidBrackets(char originalString[]) +{ + Stack* bracketsStack = stackNew(); + + for (int i = 0; i < strlen(originalString); i++) { + char s = originalString[i]; + + if ((s == '(') || (s == '{') || (s == '[')) { + stackPush(bracketsStack, s); + + } else if ((s == ')' && bracketsStack == NULL) + || (s == '}' && bracketsStack == NULL) + || (s == ']' && bracketsStack == NULL)) { + return 0; + + } else if ((s == ')' && stackPeek(bracketsStack) == '(') + || (s == '}' && stackPeek(bracketsStack) == '{') + || (s == ']' && stackPeek(bracketsStack) == '[')) { + stackPop(bracketsStack); + + } else { + return 0; + } + } + if (bracketsStack != NULL && bracketsStack->top != NULL) { + return 0; + } + return 1; +} + +int main(void) +{ + char originalString[100]; + scanf("%99s", originalString); + int result = isValidBrackets(originalString); + + if (result == 0) { + printf("String doesn't follow rules.\n"); + return -1; + } + printf("Balance of brackets is keep.\n"); + return 0; +} diff --git a/src/hw_5-1_proBrackets/hw_5-1_proBrackets.h b/src/hw_5-1_proBrackets/hw_5-1_proBrackets.h new file mode 100644 index 0000000..d03d442 --- /dev/null +++ b/src/hw_5-1_proBrackets/hw_5-1_proBrackets.h @@ -0,0 +1,10 @@ +#ifndef PROBRACKETS_H +#define PROBRACKETS_H + +// проверка корректности расстановки скобок +int isValidBrackets(char originalString[]); + +// ввод данных и вывод результата +int main(void); + +#endif \ No newline at end of file diff --git a/src/stack/stack.c b/src/stack/stack.c new file mode 100644 index 0000000..caec476 --- /dev/null +++ b/src/stack/stack.c @@ -0,0 +1,81 @@ +#include "stack.h" +#include +#include + +// создание пустого стека +Stack* stackNew(void) { + Stack* stack = (Stack*)malloc(sizeof(Stack)); + if (stack != NULL) { + stack->top = NULL; + } + return stack; +} + +// добавление элемента на стек +int stackPush(Stack* stack, int value) { + if (stack == NULL) { + printf("Stack is NULL!\n"); + return -1; + } + + // создаем новый узел + Node* new_node = (Node*)malloc(sizeof(Node)); + if (new_node == NULL) { + printf("Memory failed!\n"); + return -1; + } + + // заполняем узел + new_node->data = value; + new_node->next = stack->top; + + // обновляем вершину стека + stack->top = new_node; +} + +// взятие элемента со стека +int stackPop(Stack* stack) { + if (stack == NULL || stack->top == NULL) { + printf("Stack is empty!\n"); + return -1; + } + + // сохраняем данные из вершины + Node* temp = stack->top; + int value = temp->data; + + // перемещаем вершину на следующий элемент + stack->top = stack->top->next; + + // освобождаем память удаляемого узла + free(temp); + + return value; +} + +// просмотр элемента на вершине стека +int stackPeek(Stack* stack) { + if (stack == NULL || stack->top == NULL) { + printf("Stack is empty!\n"); + return -1; + } + + return stack->top->data; +} + +// удаление всего стека и освобождение памяти +void stackDelete(Stack* stack) { + if (stack == NULL) { + return; + } + + // освобождаем все узлы + while (stack->top != NULL) { + Node* temp = stack->top; + stack->top = stack->top->next; + free(temp); + } + + // освобождаем саму структуру стека + free(stack); +} \ No newline at end of file diff --git a/src/stack/stack.h b/src/stack/stack.h new file mode 100644 index 0000000..7951dc1 --- /dev/null +++ b/src/stack/stack.h @@ -0,0 +1,29 @@ +#ifndef STACK_H +#define STACK_H + +#include + +// максимальный размер стека +#define STACK_MAX_SIZE 100 + +// структура узла стека +typedef struct Node { + int data; // целочисленные данные + struct Node* next; // указатель на следующий узел +} Node; + +// структура стека +typedef struct { + Node* top; // указатель на вершину стека +} Stack; + +// основные операции +int stackPush(Stack* stack, int value); // положить элемент на стек +int stackPop(Stack* stack); // взять элемент со стека +int stackPeek(Stack* stack); // посмотреть на элемент на вершине стека + +// служебные функции +Stack* stackNew(void); // создать пустой стек +void stackDelete(Stack* stack); // удалить весь стек (освободить память) + +#endif \ No newline at end of file