栈---括号匹配问题---有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串s ,判断字符串是否有效。每个右括号都有一个对应的相同类型的左括号,左括号必须以正确的顺序闭合,左括号必须以相同类型的右括号闭合。

对于这种括号匹配问题,就可以使用到栈来完成,我们可以遍历这个字符串s,将其中所有左括号压栈,其中右括号就与对应左括号匹配并将该左括号出栈,以此重复进行,直到栈内为空NULL或者遍历到\0结束。

由于我们需要用到栈,因此需要写入栈的实现。栈的实现过后,我们才正式开始完成括号匹配问题。

在字符串遍历过程中,遇到左侧三种括号,压栈:

if ((*s == '{') || (*s == '[') || (*s == '('))
    {
        AStackPush(&as, *s);
    }

遇到右侧三种括号,先判断栈是否为空,为空说明这个字符串s是从右括号开始的,不符合括号匹配,直接返回false:

if (AStackEmpty(&as))
    {
        AStackDestroy(&as);
        return false;
    }

栈不为空时,我们获取栈顶元素放入tmp变量中,使用if条件判断,当tmp为左括号而*s不是对应的右括号时,那么销毁栈并返回false:

char top = AStackTop(&as);
AStackPop(&as);
if ((*s == ')' && top != '(')
 || (*s == ']' && top != '[')
 || (*s == '}' && top != '{'))
    {
          AStackDestroy(&as);
          return false;
    }

那么整体循环如下:

    while (*s)
    {
        if ((*s == '{') || (*s == '[') || (*s == '('))
        {
            AStackPush(&as, *s);
        }
        else
        {
            if (AStackEmpty(&as))
            {
                AStackDestroy(&as);
                return false;
            }
            char top = AStackTop(&as);
            AStackPop(&as);
            if ((*s == ')' && top != '(')
                || (*s == ']' && top != '[')
                || (*s == '}' && top != '{'))
            {
                AStackDestroy(&as);
                return false;
            }
        }
        s++;
    }

最后出循环后,如果栈为空,那么说明左右括号全部匹配,返回true,否则返回false:

bool ret = AStackEmpty(&as);
AStackDestroy(&as);
return ret;

整体代码如下:

bool isValid(char* s)
{
    AS as;
    AStackInit(&as);
    while (*s)
    {
        if ((*s == '{') || (*s == '[') || (*s == '('))
        {
            AStackPush(&as, *s);
        }
        else
        {
            if (AStackEmpty(&as))
            {
                AStackDestroy(&as);
                return false;
            }
            char top = AStackTop(&as);
            AStackPop(&as);
            if ((*s == ')' && top != '(')
                || (*s == ']' && top != '[')
                || (*s == '}' && top != '{'))
            {
                AStackDestroy(&as);
                return false;
            }
        }
        s++;
    }
    bool ret = AStackEmpty(&as);
    AStackDestroy(&as);
    return ret;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值