走过路过的大神,帮我找一下错误吧。我被wrong的内伤了。

__103__ 2013-05-03 10:36:44
题目是这样的:
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;
}
...全文
137 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
__103__ 2013-05-04
  • 打赏
  • 举报
回复
引用 9 楼 hugett 的回复:
给你一组数据吧:{()()} 这题要用栈来做的。。左括号进栈,右括号出栈,进栈的时候跟栈顶的左括号比较优先级,低就进栈,高就出错。。
我还没学过
a784063999 2013-05-04
  • 打赏
  • 举报
回复
if(b[j]<0) for(k=j-1;k>=0;k--) { if(b[k]==-b[j]) // 如果()), 到第二個)時也會找到(而輸出YES break; } if(k<0) flag=0;
hugett 2013-05-04
  • 打赏
  • 举报
回复
给你一组数据吧:{()()} 这题要用栈来做的。。左括号进栈,右括号出栈,进栈的时候跟栈顶的左括号比较优先级,低就进栈,高就出错。。
__103__ 2013-05-03
  • 打赏
  • 举报
回复
引用 7 楼 a784063999 的回复:
if(a[j]<0) // 應該是b吧 for(k=i;k>=0;k--) // 應該k=j;... { if(a[k]==-a[i]) // 應該是b吧 break; } if(i<0) // i的值不會<0 flag=0;
#include<stdio.h> #include<string.h> int main () { char a[256]; int n,m,b[256],sum=0; int i,j,k=0,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=1;j<m;j++) { sum+=b[j-1]; if(b[j]>b[j-1]&&sum!=0) { flag=0; break; } if(b[0]<0) { flag=0; break; } if(b[j]<0) for(k=j-1;k>=0;k--) { if(b[k]==-b[j]) break; } if(k<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; } 改成这样。还是wrong!!!!
a784063999 2013-05-03
  • 打赏
  • 举报
回复
if(a[j]<0) // 應該是b吧 for(k=i;k>=0;k--) // 應該k=j;... { if(a[k]==-a[i]) // 應該是b吧 break; } if(i<0) // i的值不會<0 flag=0;
__103__ 2013-05-03
  • 打赏
  • 举报
回复
引用 5 楼 a784063999 的回复:
if(a[j]<0) for(k=i;k>=0;k--) { if(a[k]==-a[i]) break; } if(i<0) flag=0 這應該也有問題吧
额。是不是倒数第二行 应该是 if(k<0)
a784063999 2013-05-03
  • 打赏
  • 举报
回复
if(a[j]<0) for(k=i;k>=0;k--) { if(a[k]==-a[i]) break; } if(i<0) flag=0 這應該也有問題吧
__103__ 2013-05-03
  • 打赏
  • 举报
回复
引用 3 楼 a784063999 的回复:
[quote=引用 楼主 u010435367 的回复:] 题目是这样的: ... 例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
你說的[/quote] 我错了。不过改成 ">"之后还是wrong……why??
a784063999 2013-05-03
  • 打赏
  • 举报
回复
引用 楼主 u010435367 的回复:
题目是这样的: ... 例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
你說的
__103__ 2013-05-03
  • 打赏
  • 举报
回复
引用 1 楼 a784063999 的回复:
if(b[j+1]>=b[j]&&sum!=0)// 如果是{{}}, b[0]==b[1], 就輸出NO? { flag=0; break; }
我觉得这样子应该不可以吧。符合运算法则吗?
a784063999 2013-05-03
  • 打赏
  • 举报
回复
if(b[j+1]>=b[j]&&sum!=0)// 如果是{{}}, b[0]==b[1], 就輸出NO? { flag=0; break; }

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧