Problem Description
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
Input
输入数据有多组,处理到文件结束。
Output
如果匹配就输出“yes”,不匹配输出“no”
Example Input
sin(20+10) {[}]
Example Output
yesno
#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { char *base; char *top; int stacksize; } SqStack; int InitStack(SqStack &S) { S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char)); if( !S.base) return -1; S.top = S.base; S.stacksize = STACK_INIT_SIZE; return 0; } int GetTop(SqStack &S) { return *(S.top - 1); } int Push(SqStack &S, char e) { if(S.top - S.base >= S.stacksize) { S.base = (char*)realloc(S.base, (S.stacksize + STACKINCREMENT) *sizeof(char)); if(!S.base) return -1; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return 0; } void Pop(SqStack &S) { S.top--; } int main() { char s[60]; int flag, i; while(gets(s) != NULL) { SqStack S; InitStack(S); flag = 0; for(i = 0; s[i] != '\0'; i++) { if(s[i] == '[' || s[i] == '(' || s[i] == '{') { Push(S, s[i]); } else if(s[i] == ')') { if(S.base == S.top) { flag = 1; break; } else { if(GetTop(S) == '(') { Pop(S); } else { flag = 1; break; } } } else if(s[i] == ']') { if(S.base == S.top) { flag = 1; break; } else { if(GetTop(S) == '[') { Pop(S); } else { flag = 1; break; } } } else if(s[i] == '}') { if(S.base == S.top) { flag = 1; break; } else { if(GetTop(S) == '{') { Pop(S); } else { flag = 1; break; } } } if(flag == 1) break; } if(flag == 0 && S.base == S.top) printf("yes\n"); else printf("no\n"); } return 0; }