您的位置:首页 > 其它

括号匹配

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: