LeetCode:20. 有效的括号

目录

前言

题目

规律

思路

tip:这里我们可能不会注意到的两点:

主代码实现

源码


前言

小伙伴们大家好,今天为大家带来的是力扣第二十题:有效的括号。

本文我们将通过栈的方式去实现,因为栈的特性:先进后出。

题目

题目如下所示:

如上图所示,题目要求判断一个字符串是否有效,而是否有效的判断方法是字符串中的三种括号是按照类似“回文”的形式存放的,也就是说必须是类似这样的:( { [ ] } )或者是 ()[ ] { } 。

规律

1.先入栈左括号,如果*s表示的字符一直是左括号,那么就一直入栈,直到不是左括号结束本次入栈。

2.接着将入栈的元素出栈,与其之后的一个元素比较,如果左右括号不匹配,直接返回false退出。

如果比较发现是匹配的,那么 s++,继续从第一步开始。重复进行,直到*s为空,也就是字符串结束。

核心思想:入栈入到不是右括号停下,出栈,与接下来的一个元素比较。

思路

因为我们想通过栈的方式去实现,所以通过以上规律我们有以下思路:

首先我们需要实现简单的栈的初始化,压栈,出栈,取栈顶数据,判断栈是否为空等几个需要用到的函数。

核心思路

其次,我们需要一个外层循环。在循环中,首先,我们需要进行入栈操作,如果是左括号就入栈,否则在 s 自增1的前提下,进入 else 条件,在 else 里面首先我们需要将刚才入栈的元素出栈,然后与接下来的 *s 比较,判断是否是匹配的括号。

当然这里不是全部的内容,因为还有没有入栈的情况没有修正以及如果比较完了。

tip:这里我们可能不会注意到的两点:

(1)首先如果字符串中没有左括号,只有右括号,那么将不会进行压栈操作,此时栈顶是没有元素的,如果依旧进行比较,那么将会报错。所以我们在比较之前,必须加上一个判断当前栈是否为空的判断条件。​​​​​​​​​​​​​​

(2)其次,如果当字符串比较完了之后,发现栈里面还有元素,就说明左括号是多出来的。此时应该返回false,但是一般按正常情况,当字符串比较完事的时候,说明应该是有效括号的。

主代码实现

下面是主要代码实现部分,源码我们将会放在后面,因为篇幅确实有点长。

bool isValid(char * s){
     ST st;
     StackInit(&st);
     while(*s)
     {
        //压栈
        if(*s=='('|| *s=='{'|| *s=='[')
        {
            StackPush(&st,*s);
            s++;
        }
        else
        {
            //如果栈里面没有元素,说明是右括号,需要返回false
            if(StackEmpty(&st))
            {
                return false;
            }
            //找栈顶元素
            STDataType top=StackTop(&st);
            //出栈
            StackPop(&st);
            //比较
            if((*s==')' && top!='(')||
               (*s=='}' && top!='{')||
               (*s==']' && top!='['))
               {
                   StackDestroy(&st);
                   return false;
               }
               else
               {
                   s++;
               }
        }
     }
     //如果栈不为空,说明没有比较完,返回false
     //如果栈空了,返回true
     bool tmp=StackEmpty(&st);
     StackDestroy(&st);
     return tmp;
}

 那么对于该部分主要代码实现部分,我们作以下解释:

首先,因为我们是用动态内存开辟的空间,所以我们最后我们需要释放,否则可能发生内存泄漏。所以在每次 return 之前,我们都调用了 StackDestroy 函数将动态内存开辟的空间释放。

然后,对于上述两点小提示,可能在第一次的写的时候不容易发现,但是当报错了之后,我们应该根据错误提示,然后补全代码。

最后,如果还需要注意的话,那就是对于字符指针,指针变量自增,也就是指针指向的位置向后移动一位。

如果有需要源码的小伙伴,还请留言评论哦!

好的,那么本文到此就结束啦!如有问题,还请指正呀!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值