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