diff --git a/5.Stack-and-Quene/Stack/stack.c b/5.Stack-and-Quene/Stack/stack.c new file mode 100644 index 0000000..f23663f --- /dev/null +++ b/5.Stack-and-Quene/Stack/stack.c @@ -0,0 +1,74 @@ +#include +#include +#include "stack.h" + + +OBJ* stack_new(void) +{ + return NULL; +} + +OBJ* stack_push(OBJ* top, char data) +{ + OBJ* ptr = malloc(sizeof(OBJ)); + ptr->data = data; + ptr->next = top; + + return ptr; +} + +// Взять элемент со стека +OBJ* stack_pop(OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return top; + } + + OBJ* ptr_next = top->next; + free(top); + + return ptr_next; +} + +OBJ* stack_delete(OBJ* top) +{ + OBJ* current = top; + while (current != NULL) + { + OBJ* temp = current; + current = current->next; + free(temp); + } + + return 0; +} + +// Функция для просмотра элемента сверху +char stack_peek(const OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return -1; + } + + return top->data; +} + +void show(const OBJ* top) +{ + const OBJ* current = top; + if(top == NULL) + { + printf("Стек пуст\n"); + return; + } + + while(current != NULL) + { + printf("%d\n", current->data); + current = current->next; + } +} diff --git a/5.Stack-and-Quene/Stack/stack.h b/5.Stack-and-Quene/Stack/stack.h new file mode 100644 index 0000000..83434cc --- /dev/null +++ b/5.Stack-and-Quene/Stack/stack.h @@ -0,0 +1,28 @@ +#ifndef STACK_H +#define STACK_H + +typedef struct tag_obj +{ + char data; + struct tag_obj* next; +} OBJ; + +// Создание нового стека +OBJ* stack_new(void); + +// Добавление элемента на стек +OBJ* stack_push(OBJ* top, char data); + +// Удаление верхнего элемента +OBJ* stack_pop(OBJ* top); + +// Удаление стека +OBJ* stack_delete(OBJ* top); + +// Просмотр верхнего элемента +char stack_peek(const OBJ* top); + +// Вывод содержимого +void stack_show(OBJ* top); + +#endif \ No newline at end of file diff --git a/5.Stack-and-Quene/Task_1/Advancd-bracket-balance.c b/5.Stack-and-Quene/Task_1/Advancd-bracket-balance.c new file mode 100644 index 0000000..bd39178 --- /dev/null +++ b/5.Stack-and-Quene/Task_1/Advancd-bracket-balance.c @@ -0,0 +1,82 @@ +#include +#include +#include "../Stack/stack.h" + + +char get_matching_opening(char closing) { + switch(closing) { + case ')': return '('; + case ']': return '['; + case '}': return '{'; + default: return '\0'; + } +} + +int check_balance(const char* text) +{ + OBJ* stack = stack_new(); + int length = strlen(text); + + for (int i = 0; i < length; i++) + { + char current = text[i]; + + if(current == '(' || current == '[' || current == '{') + { + stack = stack_push(stack, current); + } + + else if(current == ')' || current == ']' || current == '}') + { + if(stack == NULL) + { + stack_delete(stack); + return 0; + } + + char expected = get_matching_opening(current); + char actual = stack_peek(stack); + + if(actual == expected) + { + stack = stack_pop(stack); + } + else + { + stack_delete(stack); + return 0; + } + } + } + + int result = (stack == NULL); + stack_delete(stack); + + return result; +} + + +int main(void) +{ + char text[1000]; + + printf("Введите текст\n"); + if (fgets(text, sizeof(text), stdin) == NULL) + { + printf("Ошибка ввода!\n"); + return 1; + } + + if (check_balance(text)) + { + printf("Скобки сбалансированы\n"); + } + + else + { + printf("Скобки не сбалансированны\n"); + } + + return 0; + +} diff --git a/5.Stack-and-Quene/Task_1/a.out b/5.Stack-and-Quene/Task_1/a.out new file mode 100755 index 0000000..d80c904 Binary files /dev/null and b/5.Stack-and-Quene/Task_1/a.out differ diff --git a/Stack/stack.c b/Stack/stack.c new file mode 100644 index 0000000..51cb4a7 --- /dev/null +++ b/Stack/stack.c @@ -0,0 +1,80 @@ +#include +#include +#include "stack.h" + + +typedef struct tag_obj +{ + int data; + struct tag_obj* next; +} OBJ; + +OBJ* stack_new(void) +{ + return NULL; +} + +OBJ* stack_push(OBJ* top, int data) +{ + OBJ* ptr = malloc(sizeof(OBJ)); + ptr->data = data; + ptr->next = top; + + return ptr; +} + +// Взять элемент со стека +OBJ* stack_pop(OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return top; + } + + OBJ* ptr_next = top->next; + free(top); + + return ptr_next; +} + +OBJ* stack_delete(OBJ* top) +{ + OBJ* current = top; + while (current != NULL) + { + OBJ* temp = current; + current = current->next; + free(temp); + } + + return 0; +} + +// Функция для просмотра элемента сверху +int stack_peek(const OBJ* top) +{ + if(top == NULL) + { + printf("Стек пуст\n"); + return -1; + } + + return top->data; +} + +void show(const OBJ* top) +{ + const OBJ* current = top; + if(top == NULL) + { + printf("Стек пуст\n"); + return; + } + + while(current != NULL) + { + printf("%d\n", current->data); + current = current->next; + } +} diff --git a/Stack/stack.h b/Stack/stack.h new file mode 100644 index 0000000..ee80b5f --- /dev/null +++ b/Stack/stack.h @@ -0,0 +1,28 @@ +#ifdef STACK_H +#define STACK_H + +typedef struct tag_obj +{ + int data; + struct tag_obj* next; +} OBJ; + +// Создание нового стека +OBJ* stack_new(void); + +// Добавление элемента на стек +OBJ* stack_push(OBJ* top, int data); + +// Удаление верхнего элемента +OBJ* stack_pop(OBJ* top); + +// Удаление стека +OBJ* stack_delete(OBJ* top); + +// Просмотр верхнего элемента +int stack_peek(OBJ* top); + +// Вывод содержимого +void stack_show(OBJ* top); + +#endif \ No newline at end of file