目录
前言
小伙伴们大家好,今天为大家带来的是力扣第二十题:有效的括号。
本文我们将通过栈的方式去实现,因为栈的特性:先进后出。
题目
题目如下所示:
如上图所示,题目要求判断一个字符串是否有效,而是否有效的判断方法是字符串中的三种括号是按照类似“回文”的形式存放的,也就是说必须是类似这样的:( { [ ] } )或者是 ()[ ] { } 。
规律
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 函数将动态内存开辟的空间释放。
然后,对于上述两点小提示,可能在第一次的写的时候不容易发现,但是当报错了之后,我们应该根据错误提示,然后补全代码。
最后,如果还需要注意的话,那就是对于字符指针,指针变量自增,也就是指针指向的位置向后移动一位。
如果有需要源码的小伙伴,还请留言评论哦!
好的,那么本文到此就结束啦!如有问题,还请指正呀!