From 4002fb4a8905599f79116e5a47472ba5d4a119ba Mon Sep 17 00:00:00 2001 From: Anzhelika Nikolaieva Date: Wed, 1 Nov 2023 14:16:41 +0000 Subject: [PATCH] Update 'a1/program.c' --- a1/program.c | 116 +++++++++++++++++++++++++-------------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/a1/program.c b/a1/program.c index 9613473..8218836 100644 --- a/a1/program.c +++ b/a1/program.c @@ -1,23 +1,67 @@ #include #include #include -#include +bool brackets(const char *code) { + int stack[100]; + int top = -1; -#define MAX_SIZE 100 -struct Stack { - char data[MAX_SIZE]; - int size; -} stack; + for (int i = 0; code[i] != '\0'; i++) { + if (code[i] == '(' || code[i] == '[' || code[i] == '{' || code[i] == '<') { + stack[++top] = i; + } else if (code[i] == ')' || code[i] == ']' || code[i] == '}' || code[i] == '>') { + if (top == -1) { + printf("Unexpected closing bracket %c in %d\n", code[i], i); + return false; + } + + int opening = stack[top--]; + char expected_opening = 0; + + if (code[i] == ')') { + expected_opening = '('; + } else if (code[i] == ']') { + expected_opening = '['; + } else if (code[i] == '}') { + expected_opening = '{'; + } else if (code[i] == '>') { + expected_opening = '<'; + } + + if (code[opening] != expected_opening) { + printf("Crossed bracket %c in %d, expected %c\n", code[i], i, expected_opening); + return false; + } + } + } + + while (top >= 0) { + int opening = stack[top--]; + char unclosed = code[opening]; + char expected_closing = 0; + + if (unclosed == '(') { + expected_closing = ')'; + } else if (unclosed == '[') { + expected_closing = ']'; + } else if (unclosed == '{') { + expected_closing = '}'; + } else if (unclosed == '<') { + expected_closing = '>'; + } + + if (top == -1) { + printf("Missing closing brackets: %c\n", expected_closing); + return false; + } + + } + return top == -1; +} int main() { - char code[MAX_SIZE]; - stack.size = 0; - - if (fgets(code, sizeof(code), stdin) == NULL) { - printf("Error reading input.\n"); - return 1; - } + char code[100]; + fgets(code, sizeof(code), stdin); if (code[strlen(code) - 1] == '\n') { code[strlen(code) - 1] = '\0'; @@ -25,51 +69,7 @@ int main() { printf("Read: %s\n", code); - char missing_closing[MAX_SIZE]; - int missing_count = 0; - - if (strlen(code) > MAX_SIZE) { - return 1; - } - - for (int i = 0; code[i] != '\0'; i++) { - if (code[i] == '(' || code[i] == '[' || code[i] == '{' || code[i] == '<') { - if (stack.size < MAX_SIZE) { - stack.data[stack.size++] = code[i]; - } else { - exit(0); - } - } else if (code[i] == ')' || code[i] == ']' || code[i] == '}' || code[i] == '>') { - if (stack.size == 0) { - printf("Unexpected closing bracket %c in %d\n", code[i], i); - return 0; - } - - char opening = stack.data[stack.size - 1]; - stack.size--; - - if ((code[i] == ')' && opening != '(') || - (code[i] == ']' && opening != '[') || - (code[i] == '}' && opening != '{') || - (code[i] == '>' && opening != '<')) { - printf("Crossed bracket %c in %d, expected %c\n", code[i], i, opening); - return 0; - } - } - } - - while (stack.size > 0) { - char unclosed = stack.data[--stack.size]; - missing_closing[missing_count++] = (unclosed == '(') ? ')' : (unclosed == '[') ? ']' : (unclosed == '{') ? '}' : '>'; - - if (missing_count >= MAX_SIZE) { - exit(0); - } - } - - if (missing_count > 0) { - printf("Missing closing brackets: %s\n", missing_closing); - } else { + if (brackets(code)) { printf("All brackets OK\n"); }