78 lines
1.3 KiB
C
78 lines
1.3 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define MAX_LEN 100
|
|
|
|
int isOpening(char c){
|
|
return (c == '(' || c == '[' || c == '{' || c == '<');
|
|
}
|
|
|
|
int isClosing(char c){
|
|
return (c == ')' || c == ']' || c == '}' || c == '>');
|
|
}
|
|
|
|
char expectedClosing(char c){
|
|
switch (c) {
|
|
case '(': return ')';
|
|
case '[': return ']';
|
|
case '{': return '}';
|
|
case '<': return '>';
|
|
default: return '?';
|
|
}
|
|
}
|
|
|
|
char expectedOpening(char c){
|
|
switch (c) {
|
|
case ')': return '(';
|
|
case ']': return '[';
|
|
case '}': return '{';
|
|
case '>': return '<';
|
|
default: return '?';
|
|
}
|
|
}
|
|
|
|
|
|
int main(){
|
|
char code[MAX_LEN + 1];
|
|
char stack[MAX_LEN];
|
|
int top = -1;
|
|
|
|
if (!fgets(code, sizeof(code), stdin)){
|
|
printf("Input error\n");
|
|
return 1;
|
|
}
|
|
|
|
code[strcspn(code, "\n")] = '\0';
|
|
|
|
printf("Read: %s\n", code);
|
|
|
|
int len = strlen(code);
|
|
for (int i = 0; i < len; i++){
|
|
char c = code[i];
|
|
|
|
if (isOpening(c)){
|
|
if (top < MAX_LEN - 1){
|
|
stack[++top] = c;
|
|
}
|
|
}
|
|
else if (isClosing(c)){
|
|
if (top < 0){
|
|
printf("Unexpected closing bracket %c in %d\n", c, i+1);
|
|
return 0;
|
|
}
|
|
char last = stack[top--];
|
|
if (expectedClosing(last) != c){
|
|
printf("Crossed bracket %c in %d, expected %c\n", c, i+1, expectedClosing(last));
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
if (top >= 0){
|
|
printf("Unclosed bracket %c in %d\n", stack[top], len);
|
|
} else {
|
|
printf("All brackets OK\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|