c语言括号匹配

问题:题意描述:在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。对于每一对括号,必须先左边括号,然后右边... 问题:
题意描述: 在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。
对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
求解我的答案哪里错了,或者是还有什么特殊解啊
#include<stdio.h>
int main()
{
char c;
int bracket[300],i,l,n,j,k,flag;
scanf("%d",&n);
{
getchar();
for(i=0;i<n;i++)
{
for(j=0;;j++)
{
scanf("%c",&c);
if(c=='\n')
{
l=j;
break;
}
if(c=='<')//将括号用相应的数字表示
bracket[j]=1;
if(c=='(')
bracket[j]=2;
if(c=='[')
bracket[j]=3;
if(c=='{')
bracket[j]=4;
if(c=='>')
bracket[j]=-1;
if(c==')')
bracket[j]=-2;
if(c==']')
bracket[j]=-3;
if(c=='}')
bracket[j]=-4;
}
flag=1;
if(bracket[0]<0)
flag=0;
else
{
for(j=1,k=0;j<l;j++)//j表示当前的位置,k表示与其匹配的位置
{
if(bracket[j]>0)
{
if(bracket[j-1]>0 && bracket[j]>bracket[j-1])//括号要求必须按照{},[],(),<>的顺序从外到里
{
flag=0;
break;
}
k=j;// 如果出现新的左括号,则k移动到新出现的左括号出
}
if(bracket[j]<0)
{
if(bracket[j]+bracket[k]!=0)
flag=0;
else
{
bracket[j]=0;
bracket[k]=0;
while(bracket[k]==0)//将j移动到前面最靠近这里的一个左括号出
k--;
}
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
}
}
return 0;
}
展开
 我来答
兔子和小强
2013-05-18 · TA获得超过6946个赞
知道大有可为答主
回答量:3332
采纳率:74%
帮助的人:1392万
展开全部

有些特殊解没考虑:当左括号溢出的时候(即左括号大于右括号)

如:

//在一个合法的括号匹配 左边 加上 不比最外层括号小 的括号 程序将输出错误。

{    //以及单单一个[,(,<,其实就是在合法的空串外面加左括号
[[[]    //在合法的[]左边加上[
{<<>>    //在合法的<<>>左边加{
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式