括号匹配
2014-11-18 18:34
183 查看
★实验任务小明正在解决一道计算题, 不小心碰洒了一瓶墨水, 使一部分算式看不清了,计算题是做不了了,
但是算式中有着许多括号包括有大括号{}, 中括号[],
小括号(),
尖括号<>。 对于每一对括号, 必须先左边括号, 然后右边括号;
如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,
{[()]},
{()},{{}}为一个合法的表达式, 而([{}]),
{([])},[{<>}]都是非法的。,小明对这些是括号很有兴趣, 他将这些括号单独抄写下来, 小明想知道括号是否能相互匹配的,你能帮助他吗?
★数据输入
输入为一行仅包含上述四类括号组成的括号表达式,长度小于等于
100000.
★数据输出
对于每个输入,考虑表达式的合法性,合法输出 YES,非法输出 NO。
输入示例 输出示例
{[(<>)]}
YES
[()] YES
<>()[]{} YES
[{}] NO
{()} YES
#include <stdio.h>
char sign[50001];
int main(void)
{
int i,tmp,result=0;
int prev=123;
for(i=0;i<50001;i++)
{
sign[i]=getchar();
if(sign[i]=='\n') //能读到回车有两种情况1.括号都消去了,只剩下回车,那么i==0 2.还有一种<<<<<<<<<<>
{
if(i==0)
{
result=1;
break;
}
else
break;
}
if(((tmp=sign[i]-prev)==2 || tmp==1)) //检查匹配消去问题的算法,借鉴于阿威
{
if(i>1)
{
sign[i-1]=sign[i]=0;
prev=sign[i-2];
i-=2;
}
else if(i>0)
{
sign[i-1]=sign[i]=0;
i=-1;
prev=123;
}
else //用来处理}开头的情况
break;
}
else if((tmp=sign[i]-prev)==0 || tmp==20 || tmp==-51 || tmp==-31 || tmp==-32 || tmp==-83 || tmp==-63)
prev=sign[i]; //检查是否能与上一次的括号按照嵌套顺序对接(而非消去)
//也能处理> ) ]开头的情况
else
break; //处理本次括号与上一次括号无法对接的情况
}
if(result==1)
printf("YES");
else
printf("NO");
return 0;
}
但是算式中有着许多括号包括有大括号{}, 中括号[],
小括号(),
尖括号<>。 对于每一对括号, 必须先左边括号, 然后右边括号;
如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,
{[()]},
{()},{{}}为一个合法的表达式, 而([{}]),
{([])},[{<>}]都是非法的。,小明对这些是括号很有兴趣, 他将这些括号单独抄写下来, 小明想知道括号是否能相互匹配的,你能帮助他吗?
★数据输入
输入为一行仅包含上述四类括号组成的括号表达式,长度小于等于
100000.
★数据输出
对于每个输入,考虑表达式的合法性,合法输出 YES,非法输出 NO。
输入示例 输出示例
{[(<>)]}
YES
[()] YES
<>()[]{} YES
[{}] NO
{()} YES
#include <stdio.h>
char sign[50001];
int main(void)
{
int i,tmp,result=0;
int prev=123;
for(i=0;i<50001;i++)
{
sign[i]=getchar();
if(sign[i]=='\n') //能读到回车有两种情况1.括号都消去了,只剩下回车,那么i==0 2.还有一种<<<<<<<<<<>
{
if(i==0)
{
result=1;
break;
}
else
break;
}
if(((tmp=sign[i]-prev)==2 || tmp==1)) //检查匹配消去问题的算法,借鉴于阿威
{
if(i>1)
{
sign[i-1]=sign[i]=0;
prev=sign[i-2];
i-=2;
}
else if(i>0)
{
sign[i-1]=sign[i]=0;
i=-1;
prev=123;
}
else //用来处理}开头的情况
break;
}
else if((tmp=sign[i]-prev)==0 || tmp==20 || tmp==-51 || tmp==-31 || tmp==-32 || tmp==-83 || tmp==-63)
prev=sign[i]; //检查是否能与上一次的括号按照嵌套顺序对接(而非消去)
//也能处理> ) ]开头的情况
else
break; //处理本次括号与上一次括号无法对接的情况
}
if(result==1)
printf("YES");
else
printf("NO");
return 0;
}