diff --git a/a1/program.c b/a1/program.c index 9b8ee22..78f9cc5 100644 --- a/a1/program.c +++ b/a1/program.c @@ -1,67 +1,19 @@ #include #include #include +#include -bool brackets(const char *code) { - int stack[100]; - int top = -1; +#define MAX_SIZE 100 - - 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; -} +struct stack { + char data[MAX_SIZE]; + int size; +} stack; int main() { - char code[100]; + char code[MAX_SIZE]; + stack.size = 0; + fgets(code, sizeof(code), stdin); if (code[strlen(code) - 1] == '\n') { @@ -70,11 +22,49 @@ int main() { printf("Read: %s\n", code); - if (brackets(code)) { + char missing_closing[MAX_SIZE]; + int missing_count = 0; + + 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 { printf("All brackets OK\n"); } return 0; } - - \ No newline at end of file