#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); int err = 0; if (is_valid_brackets(input, &err)) { printf("All brackets OK\n"); } 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 == '>') { if (top >= 0 && c == getExpectedClosing(stack[top])) { top--; } else { printf("Crossed bracket %c in %d, expected %c\n", c, err, (top >= 0) ? getExpectedClosing(stack[top]) : '?'); return 0; } } } char c = input[err - 1]; if (c == ')' || c == ']' || c == '}' || c == '>') { if (top < -1) { printf("Unexpected closing bracket %c in %d\n", c, err); } } else { printf("Missing closing brackets: "); for (int i = top; i > -1; i--) { printf("%c", getExpectedClosing(stack[i])); } printf("\n"); } } } else { printf("Error reading input\n"); } return 0; }