Problem Description
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
Input
输入数据有多组,处理到文件结束。
Output
如果匹配就输出“yes”,不匹配输出“no”
Example Input
sin(20+10) {[}]
Example Output
yes no
Hint
Author
#include <stdio.h> #include <stdlib.h> #include <bits/stdc++.h> #define stackmax 10000 #define stacknum 10 #define true 1 #define false 0 using namespace std; typedef int status; typedef char selemtype; typedef struct { selemtype *base; selemtype *top; int stacksize; } sqstack; int Initstack(sqstack &S) { S.base=new selemtype[stackmax]; if (! S.base) return 0; S.top=S.base; S.stacksize=stackmax; return 1; } int push(sqstack &S, selemtype &e) { if(S.top-S.base>=S.stacksize) { S.base=(selemtype *)realloc(S.base,(S.stacksize+stackmax)*sizeof(selemtype)); if(!S.base) return 0; S.top=S.base+S.stacksize; S.stacksize += stacknum; } *(S.top)=e; S.top++; return 1; } status isempty(sqstack &S) { if(S.base==S.top) return true; else return false; } int pop(sqstack &S, selemtype &e) { if(S.top==S.base) return 0; e=*(S.top-1); S.top--; return 1; } int Gettop(sqstack S, selemtype &e) { if(S.base==S.top) return 0; e=*(S.top-1); return 1; } int main() { char a[55]; int flag; selemtype e; while(gets(a)) { flag=1; sqstack S; Initstack(S); for(int i=0; a[i]!='\0'; i++) { if(a[i]=='['||a[i]=='('||a[i]=='{') { push(S,a[i]); } else if(a[i]==']') { if(isempty(S)) { flag=0; break; } else { Gettop(S,e); if(e=='[') { pop(S,e); } else { flag=0; break; } } } else if(a[i]==')') { if(isempty(S)) { flag=0; break; } else { Gettop(S,e); if(e=='(') { pop(S,e); } else { flag=0; break; } } } else if(a[i]=='}') { if(isempty(S)) { flag=0; break; } else { Gettop(S,e); if(e=='{') { pop(S,e); } else { flag=0; break; } } } } if(!isempty(S)) { flag=0; } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }