diff --git a/src/23oct25/main.c b/src/23oct25/main.c new file mode 100644 index 0000000..f228fd9 --- /dev/null +++ b/src/23oct25/main.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include "../stack/stack.h" + +bool isBalanced(const char* str) { + struct Stack* stack = new(); + bool balanced = true; + + for (int i = 0; str[i] != '\0'; i++) { + char ch = str[i]; + if (ch == '(' || ch == '[' || ch == '{') { + stack = push(stack, ch); + } else if (ch == ')' || ch == ']' || ch == '}') { + if (stack == NULL) { + balanced = false; + break; + } + + int top; + stack = pop(stack, &top); + + if ((ch == ')' && top != '(') || (ch == ']' && top != '[') || (ch == '}' && top != '{')) { + balanced = false; + break; + } + } + } + + if (stack != NULL) { + balanced = false; + delete(stack); + } + + return balanced; +} + +int main(void) { + const char* tests[] = {"()", "[]", "{}", "({})", "({)}", "((()))", "([{}])", "}{", "(", ")", ""}; + int numTests = sizeof(tests) / sizeof(tests[0]); + + for (int i = 0; i < numTests; i++) { + printf("String: \"%s\" is %s\n", tests[i], isBalanced(tests[i]) ? "сбалансирована" : "не сбалансирована"); + } + + return 0; +} diff --git a/src/stack/stack.c b/src/stack/stack.c new file mode 100644 index 0000000..e2e6315 --- /dev/null +++ b/src/stack/stack.c @@ -0,0 +1,53 @@ +#include +#include "stack.h" + +struct Stack { + int value; + struct Stack* next; +}; + +struct Stack* push(struct Stack* stack, int value) +{ + struct Stack* newStack = malloc(sizeof(struct Stack)); + + if (!newStack) + return NULL; + + newStack->value = value; + newStack->next = stack; + return newStack; +} + +struct Stack* pop(struct Stack* stack, int* value) +{ + if (stack == NULL) + return NULL; + + struct Stack* temp = stack->next; + *value = stack->value; + free(stack); + return temp; +} + +int peek(struct Stack* stack) +{ + if (stack == NULL) + return -1; + + return stack->value; +} + +struct Stack* new(void) +{ + return NULL; +} + +void delete(struct Stack* stack) +{ + while (stack != NULL) { + struct Stack* temp = stack; + stack = stack->next; + free(temp); + } +} + diff --git a/src/stack/stack.h b/src/stack/stack.h new file mode 100644 index 0000000..babbcde --- /dev/null +++ b/src/stack/stack.h @@ -0,0 +1,18 @@ +#pragma once + +struct Stack; + +// Создает новый стек с NULL +struct Stack* new(void); + +// Кладет элемент на стек и возвращает измененный стек +struct Stack* push(struct Stack* stack, int value); + +// Берет элемент со стек, возвращает измененный стек, сохраняет удаленное значение в аргумент value +struct Stack* pop(struct Stack* stack, int* value); + +// Возвращает верхний элемент стека +int peek(struct Stack* stack); + +// Удаляет весь стек +void delete(struct Stack* stack); \ No newline at end of file