走过路过的大神,帮我找一下错误吧。我被wrong的内伤了。
题目是这样的:
Description题意描述: 在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。 对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
Input文件的第一行为一个整数n(1≤n≤100),接下来有n行仅由上述四类括号组成的括号表达式。第i+1行表示第i个表达式。每个括号表达式的长度不超过255。
Output在输出文件中有N行,其中第I行对应第I个表达式的合法性,合法输出YES,非法输出NO。
Sample Input
5
{[(<>)]}
[()]
<>()[]{}
[{}]
{()}
Sample Output
YES
YES
YES
NO
YES
我的代码是这样的:
#include<stdio.h>
#include<string.h>
int main ()
{
char a[255];
int n,m,b[255],sum=0;
int i,j,k,flag=1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a);
m=strlen(a);
for(j=0;j<m;j++)
{
switch(a[j])
{
case '{':b[j]=4;break;
case '[':b[j]=3;break;
case '(':b[j]=2;break;
case '<':b[j]=1;break;
case '}':b[j]=-4;break;
case ']':b[j]=-3;break;
case ')':b[j]=-2;break;
case '>':b[j]=-1;break;
}
sum+=b[j];
}
if(m%2!=0||sum!=0)
{
flag=1;
for(j=0;j<m;j++)
{
a[j]='\0';
b[j]='\0';
}
sum=0;
printf("NO\n");
continue;
}
sum=0;
for(j=0;j<m-1;j++)
{
sum+=b[j];
if(b[j+1]>=b[j]&&sum!=0)
{
flag=0;
break;
}
if(a[j]<0)
for(k=i;k>=0;k--)
{
if(a[k]==-a[i])
break;
}
if(i<0)
flag=0;
}
if(flag==0)
printf("NO\n");
else
printf("YES\n");
for(j=0;j<m;j++)
{
a[j]='\0';
b[j]='\0';
}
sum=0;
flag=1;
}
return 0;
}