#include #include #define MAX_LEN 101 typedef struct { char bracket; int position; } StackItem; int is_opening(char ch) { return ch == '(' || ch == '{' || ch == '[' || ch == '<'; } int is_closing(char ch) { return ch == ')' || ch == '}' || ch == ']' || ch == '>'; } char matching_bracket(char ch) { switch (ch) { case ')': return '('; case '}': return '{'; case ']': return '['; case '>': return '<'; default: return 0; } } char expected_closing(char ch) { switch (ch) { case '(': return ')'; case '{': return '}'; case '[': return ']'; case '<': return '>'; default: return 0; } } void check_brackets(const char *line) { StackItem stack[MAX_LEN]; int stack_top = -1; printf("Read: %s\n", line); for (int i = 0; line[i] != '\0'; i++) { char ch = line[i]; if (is_opening(ch)) { if (stack_top < MAX_LEN - 1) { stack[++stack_top].bracket = ch; stack[stack_top].position = i; } else { printf("Error: Stack overflow\n"); return; } } else if (is_closing(ch)) { if (stack_top == -1) { printf("Unexpected closing bracket %c in %d\n", ch, i); return; } else if (stack[stack_top].bracket == matching_bracket(ch)) { stack_top--; } else { printf("Crossed bracket %c in %d, expected %c \n", ch, i, expected_closing(stack[stack_top].bracket)); return; } } } if (stack_top >= 0) { printf("Missing closing brackets:"); printf(" "); while (stack_top >= 0) { printf("%c", expected_closing(stack[stack_top].bracket)); stack_top--; } printf("\n"); } else { printf("All brackets OK\n"); } } int main() { char line[MAX_LEN]; if (fgets(line, sizeof(line), stdin)) { line[strcspn(line, "\n")] = '\0'; check_brackets(line); } return 0; }