题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
样例输入
4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9
样例输出
yes
no
no
no
解题思路:
加入括号一一配对,则()[] {}左右符号一一对应,也就是说在字符串中间必有一左一右括号相连并且两者对应,说先应该去掉除括号以外的其他字符,然后运用栈依次将左括号存入栈中,遇到右括号时间与栈底符号比较,匹配时间栈的标记元素减一。直到最后若栈的标记元素等零,说明栈中的括号一一匹配。
代码
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct stu{ char s[1010]; int head; int tail; }st; int funz(char s) { if(s=='(') return 1; else if(s=='[') return 2; else if(s=='{') return 3; else return -1; } int funy(char s) { if(s==')') return 1; else if(s==']') return 2; else if(s=='}') return 3; else return 0; } int main() { int i,m,n; st s1; char s0; char s[1010]; scanf("%d",&m); getchar(); while(m--) { s1.head=s1.tail=0; i=0; while(scanf("%c",&s0),s0!='\n') if(s0=='('||s0==')'||s0=='['||s0==']'||s0=='{'||s0=='}') s[i++]=s0; s[i]='\0'; if(strlen(s)%2!=0) { printf("no\n"); continue; } for(i=0;s[i]!='\0';i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.s[s1.tail++]=s[i]; else if(s[i]==')'||s[i]==']'||s[i]=='}') { if(funz(s1.s[s1.tail-1])==funy(s[i])) s1.tail--; } } if(s1.tail==0) printf("yes\n"); else printf("no\n"); } return 0; }