括号匹配

★实验任务小明正在解决一道计算题, 不小心碰洒了一瓶墨水, 使一部分算式看不清了,计算题是做不了了, 但是算式中有着许多括号包括有大括号{}, 中括号[], 小括(), 尖括号<>。 对于每一对括号, 必须先左边括号, 然后右边括号; 如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如, {[()]} {()},{{}}为一个合法的表达式, 而([{}]) {([])},[{<>}]都是非法的。,小明对这些是括号很有兴趣, 他将这些括号单独抄写下来, 小明想知道括号是否能相互匹配的,你能帮助他吗?
★数据输入
输入为一行仅包含上述四类括号组成的括号表达式,长度小于等于 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;
}
       

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值