★数据输入
输入为一行仅包含上述四类括号组成的括号表达式,长度小于等于 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;
}