#include #include #include #include #define STACK_SIZE 200 struct Stack { char values[STACK_SIZE]; int size; }; void push_stack(struct Stack* stack, char value) { assert(stack->size < STACK_SIZE); stack->values[stack->size] = value; stack->size += 1; } char pop_stack(struct Stack* stack) { assert(stack->size > 0); char value = stack->values[stack->size-1]; stack->size -= 1; return value; } int count_stack(struct Stack* stack) { return stack->size; } void print_stack(struct Stack* stack) { for (int i=0; isize; i++) { printf("%c ", stack->values[i]); } printf("\n"); } char para(char c) { if(c=='(') return ')'; if(c=='<') return '>'; if(c=='{') return '}'; if(c=='[') return ']'; if(c==')') return '('; if(c=='>') return '<'; if(c=='}') return '{'; if(c==']') return '['; } int main() { struct Stack mystack; mystack.size=0; char str[128]; fgets(str,100,stdin); if(str[strlen(str)-1]=='\n') { str[strlen(str)-1]='\0';} printf("Read: %s", str); int i=0; char c, cs; bool is_ok=true; while(str[i]!='\0' && is_ok) { c=str[i]; if(c=='<'||c=='('||c=='{'||c=='[') { push_stack(&mystack, c); } if(c=='>'||c==']'||c=='}'||c==')') { if(count_stack(&mystack)>0) cs=pop_stack(&mystack); else { printf("\nUnexpected closing bracket %c in %d\n", c,i); is_ok=false; break; } if(c=='>' && cs!='<') { printf("\nCrossed bracket %c in %d, expected %c", c, i, para(cs)); is_ok=false; break; } if(c==']' && cs!='[') { printf("\nCrossed bracket %c in %d, expected %c", c, i, para(cs)); is_ok=false; break; } if(c==')' && cs!='(') { printf("\nCrossed bracket %c in %d, expected %c", c, i, para(cs)); is_ok=false; break; } if(c=='}' && cs!='{') { printf("\nCrossed bracket %c in %d, expected %c", c, i, para(cs)); is_ok=false; break; } } i++; } if(is_ok) { if(count_stack(&mystack)>0) { printf("\nMissing closing brackets: "); do { cs=pop_stack(&mystack); printf("%c", para(cs)); }while(count_stack(&mystack)>0); printf("\n"); } else printf("\nAll brackets OK\n"); } return 0; }