标题
括号匹配
类别
字符串处理
时间限制
2S
内存限制
1000Kb
问题描述
表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。
请写一个程序,判断给定表达式中的括号是否匹配,既左右括号顺序和数量都匹配。
输入说明
输入为一个表达式字符串,长度不超过50。
输出说明
对输入的表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。
输入样例
样例1输入
[(d+f)*{}2]
样例2输入
[(2+3))
输出样例
样例1输出
yes
样例2输出
no
#include<stdio.h>
#include<string.h>
int main()
{
char a[50],b[50]={0};
int i,j=0,z=0,x=0,c=0;
gets(a);
for(i=0;a[i]!=0;i++)
{
if(a[i]==40||a[i]==41||a[i]==123||a[i]==125||a[i]==91||a[i]==93)
{
b[j]=a[i];
j++;
}
else {
continue;
}
}int t[50];j=-1;
for(i=0;i<strlen(b);i++)
{
if(b[i]==40) {j++;z++;t[j]=41; /*将每一次左括号的出现做一个标注,并且把顺序记录*/
}
if(b[i]==41) /*在右括号出现时,检验其是否与之前的左括号顺序匹配,若是则删去标注*/
{
if(t[j]!=41)break;
else{
z--;j--;
}
}
if(b[i]==123) {j++;x++;t[j]=125;
}
if(b[i]==125) { if(t[j]!=125) break;
else{
x--;j--;
}
}
if(b[i]==91) {j++;c++;t[j]=93;
}
if(b[i]==93) {
if(t[j]!=93) break;
else {
c--;j--;
}
}
}
if(z==x&&x==c&&c==0) /*标注都为零表示左右括号都匹配*/
printf("yes");
else printf("no");
return 0;
}