#include #include #include #define MAX_SIZE 1000 int is_valid_brackets(const char* s, int* err) { char stack[MAX_SIZE]; int top = -1; for (int i = 0; s[i] != '\0'; i++) { char c = s[i]; if (c == '(' || c == '[' || c == '{' || c == '<') { if (top < MAX_SIZE - 1) { stack[++top] = c; } else { *err = i +1; return 0; } } else if (c == ')' || c == ']' || c == '}' || c == '>') { if (top == -1) { *err = i +1; return 0; } char last = stack[top--]; if ((c == ')' && last != '(') || (c == ']' && last != '[') || (c == '}' && last != '{') || (c == '>' && last != '<')) { *err = i+1; return 0; } } } if (top != -1) { // Знаходимо позицію незакритої дужки char lastOpen = stack[top]; for (int i = 0; s[i] != '\0'; i++) { if (s[i] == lastOpen) { *err = i +1; return 0; } } } return 1; } char getExpectedClosing(char open) { switch (open) { case '(': return ')'; case '[': return ']'; case '{': return '}'; case '<': return '>'; default: return '?'; } } int main() { char input[MAX_SIZE]; if (fgets(input, MAX_SIZE, stdin) != NULL) { input[strcspn(input, "\n")] = '\0'; printf("Read: %s\n", input); // Додано "Read: " int err = 0; if (is_valid_brackets(input, &err)) { printf("All brackets OK\n"); // Змінено з "True" } else { char stack[MAX_SIZE]; int top = -1; for (int i = 0; i < err ; i++) { char c = input[i]; if (c == '(' || c == '[' || c == '{' || c == '<') { stack[++top] = c; } else if (c == ')' || c == ']' || c == '}' || c == '>') { top--; } } char c = input[err - 1]; if (c == ')' || c == ']' || c == '}' || c == '>') { if (top <-1) { printf("Unexpected closing bracket %c in %d\n", c, err-1); } else { printf("Crossed bracket %c in %d, expected %c\n", c, err-1, getExpectedClosing(stack[top])); } } else { printf("Unclosed bracket %c in %d\n", stack[top], err-1); } } } else { printf("Error reading input\n"); } return 0; }