栈的应用之括号匹配问题

【题目描述】
如果一个括号序列中的每个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。
例如:

char a[] = "(())abc{[(])}";//左右括号匹配不正确
char b[] = "(()))abc{[]}";//右括号多于左括号
char c[] = "(()()abc{[]}";//左括号多于右括号
char d[] = "(())abc{[]}";//左右括号匹配正确

请用一种数据结构判断出以上四个不同序列的括号是否匹配。

【思路讲解】
这里写图片描述

【代码实现】

int MatchBrackets(Stack s, const char* pStr)//括号匹配(if实现)
{
    int i = 0;
    int len = 0;
    DataType e;
    if (NULL == pStr)//判断括号表达式是否为空
    {
        return 0;
    }
    len = strlen(pStr);//求括号表达式长度
    for (i = 0; i <len; ++i)
    {
        if (!IsBrackets(pStr[i]))//判断 i 位置上的字符是否为括号
        {
            continue;//不是,继续取下一个字符
        }
        else//是括号
        {
            if (('(' == pStr[i]) || ('[' == pStr[i]) || ('{' == pStr[i]))//左括号
            {
                StackPush(&s, pStr[i]);//入栈
                continue;
            }
            else//右括号
            {
                if (StackEmpty(&s))//栈若为空
                {
                    printf("右括号比左括号多\n");
                    return 0;
                }
                else//栈中有左括号
                {
                    char Top = 0;
                    Top=StackTop(&s,&e);//获取栈顶元素
                    if ((Top == '(')&&(pStr[i] == ')'))//判断栈顶是否和 i 位置上的右括号匹配
                    {
                        StackPop(&s);
                        continue;
                    }
                    else if ((Top == '[')&&(pStr[i] == ']'))
                    {
                        StackPop(&s);
                        continue;
                    }
                    else if ((Top == '{')&&(pStr[i] == '}'))
                    {
                        StackPop(&s);
                        continue;
                    }
                    else//不匹配
                    {
                        printf("左右括号次序匹配不正确\n");
                        return 0;
                    }
                }
            }
            continue;
        }
    }
    if (StackEmpty(&s))
    {
        printf("括号匹配\n");
    }
    else
    {
        printf("左括号多于右括号\n");
    }
}

int IsBrackets(char c)//判断字符是否为括号
{
    if (('(' == c) ||( '[' == c) || ('{' == c) ||( ')' == c) ||( ']' == c) ||( '}' == c))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值