题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”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!=' ')
if(s0=='('||s0==')'||s0=='['||s0==']'||s0=='{'||s0=='}')
s[i++]=s0;
s[i]=' ';
if(strlen(s)%2!=0)
{
printf("no ");
continue;
}
for(i=0;s[i]!=' ';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 ");
else
printf("no ");
}
return 0;
}
#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!=' ')
if(s0=='('||s0==')'||s0=='['||s0==']'||s0=='{'||s0=='}')
s[i++]=s0;
s[i]=' ';
if(strlen(s)%2!=0)
{
printf("no ");
continue;
}
for(i=0;s[i]!=' ';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 ");
else
printf("no ");
}
return 0;
}