diff --git a/a1/program.c b/a1/program.c index 7c73f59..19afc2b 100644 --- a/a1/program.c +++ b/a1/program.c @@ -6,12 +6,13 @@ bool brackets(const char *code) { int stack[100]; int top = -1; + 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); + printf("Unclosed bracket %c in %d\n", code[i], i); return false; } @@ -29,25 +30,40 @@ bool brackets(const char *code) { } if (code[opening] != expected_opening) { - printf("Crossed bracket %c in %d, expected %c \n", code[i], i, expected_opening); + printf("Crossed bracket %c in %d, expected %c\n", code[i], i, expected_opening); return false; } } } - if (top != -1) { - int opening = stack[top]; - printf("Unclosed bracket %c in %d\n", code[opening], opening); - return false; - } + while (top >= 0) { + int opening = stack[top--]; + char unclosed = code[opening]; + char expected_closing = 0; - return true; + 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[100]; fgets(code, sizeof(code), stdin); - + if (code[strlen(code) - 1] == '\n') { code[strlen(code) - 1] = '\0'; }