Skip to content
19 changes: 19 additions & 0 deletions src/hw_5-1_proBrackets/README.md
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

лучше README.md

Original file line number Diff line number Diff line change
@@ -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. Программа выведет, корректно ли расположение скобок

48 changes: 48 additions & 0 deletions src/hw_5-1_proBrackets/hw_5-1_proBrackets.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include "hw_5-1_proBrackets/hw_5-1_proBrackets.h"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут не надо так длинно, если используете -I

#include "stack/stack.h"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

обычно идет после #include<...>

#include <stdio.h>
#include <string.h>

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;
}
10 changes: 10 additions & 0 deletions src/hw_5-1_proBrackets/hw_5-1_proBrackets.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#ifndef PROBRACKETS_H
#define PROBRACKETS_H

// проверка корректности расстановки скобок
int isValidBrackets(char originalString[]);

// ввод данных и вывод результата
int main(void);

#endif
81 changes: 81 additions & 0 deletions src/stack/stack.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>

// создание пустого стека
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);
}
29 changes: 29 additions & 0 deletions src/stack/stack.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef STACK_H
#define STACK_H

#include <stddef.h>

// максимальный размер стека
#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