括号匹配问题

括号匹配问题

首先要清楚括号的使用规则:
出现左括号,必有相应的右括号与之匹配,并且每对括号之间可以嵌套,但不能出现交叉情况。由此,在算法中设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。此外,输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的左括号,均属不合法的情况。当输入序列和栈同时变为空时,说明所有括号完全匹配。
主函数代码如下

int main()
{
    SqStack s;
    ElemType str[100],e;
    int length,i=0;
    InitStack(&s);//初始化栈
    gets(str);
    length = strlen(str);
    while(i<length)
    {
        switch(str[i])
        {
            case '[':
            case '(':
            case '{': Push(&s,str[i]);break;//左括号入栈
            case ']':
            case ')':
            case '}':
                if(isEmptyStack(s)==true)
            {
                printf("栈为空了,右括号多余\n");
                return;
            }
            else
            {
                GetTop(s,&e);//取出栈中栈顶元素
                if(Match(e,str[i])==true)//判断左右括号匹配
                {
                    Pop(&s,&e);//左括号出栈
                }
                else
                {
                    printf("匹配失败,左右括号不同\n");
                    return;
                }
            }
            break;
        }
        i++;
    }
    if(isEmptyStack(s)==true)//判断栈是否为空
    {
        printf("全部匹配成功\n");
    }
    else
    {
        printf("匹配失败,左括号多余\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值