#include typedef char stack_item_type; #include "stacks.h" #define is_opener(c) ((c) == '(' || (c) == '[' || (c) == '{') #define is_closer(c) ((c) == ')' || (c) == ']' || (c) == '}') #define matched(c,d) ((c) == '(' && (d) == ')' || \ (c) == '[' && (d) == ']' || \ (c) == '{' && (d) == '}') void check_closer(char closer, stack_type stack) { if (empty_stack(stack)) printf("Extra %c\n", closer); else { char opener; opener = pop(stack); if (!matched(opener, closer)) printf("%c doesn't match %c\n", opener, closer); } } main() { int c; stack_type stack; stack = create_stack(); while ((c = getchar()) != EOF) { if (is_opener(c)) push(c, stack); else if (is_closer(c)) check_closer(c, stack); } while (!empty_stack(stack)) printf("Unmatched %c\n", pop(stack)); }