目录
2.为此我们应该在最后检验栈中是否还有元素需用STEmpty(&st)这个函数。
3.所以该如何检查右括号数量多于左括号的问题呢?让我们再回看代码,如果是右括号就会开始匹配,这时如果栈内已经空了呢?是不是应该直接返回false?
a.题目链接:使用栈实现有效的括号
有效的括号https://leetcode.cn/problems/valid-parentheses/description/
b.题目:
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
题目所给代码:
bool isValid(char* s) {
}
一、题意解析
我认为这道题最重要的问题是理解题意,由已知条件我们可以明白这几个点:
1.在栈内所存储的数据类型是char字符类型。
且只有三种类型括号组成:'('
,')'
,'{'
,'}'
,'['
,']'
2.括号只有三种,每个左括号只与和他同种类型有括号匹配,因此从这里我们就可以知道,做题的思路可以有先判断数量问题,可先判断这个字符串的字符个数是偶数个,但我们这里用栈来实现,需要用到其他判断数量的方法,我们接着看。
3.左括号必须以正确的顺序闭合,这种正确顺序到底是什么意思?刚开始阅读的时候我也没体会到它的深意,事实上,这种正确的顺序就是指,不可跨越。
举一个栗子:"{({[)]}}" 、"{](}[)" 、"{]"与 "[{{()}}]"、"[]{}()"、"[]"们的数量都是偶数个,且每种类型括号都是相互匹配,但是顺序有差异。可以将两组字符串的括号用于数学计算中,就可以明显观察出第一组括号是无法组成一个有效的数学计算
1.a 题目的核心思想
用栈的方法来实现道题的核心思想是:
左括号入栈,遇到右括号的时候,栈顶元素必须为匹配的左括号。
接下来我们可以开始做题
由于题目只给出了需要实现的函数,但在实现的过程中我们需要用到栈,我们使用的是c语言解答因此还需用到栈的那些函数具体可见上篇博客:栈和队列概念与实现
二、题目具体实现
接下来让我们一步一步实现这个代码:我们用到的思想是:使左括号入栈,右括号来匹配
注意:右括号始终都没有入栈
1.初
bool isValid(char* s) {
ST st;
STInit(&st);
while (*s)//到‘/0’就结束
{
if (*s == '[' || *s == '{' || *s == '(')
{
STPush(&st, *s);
}
else
{
char top = STTop(&st);//这里就直接将左括号进行存入,方便后续比较
STPop(&st);//左括号出栈//顺序不匹配
if ((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
return false;
}
}
++s;
}STDestroy(&st);
return ret;
}
如果我们直接用现在的函数就去做题的话就会发现有问题
从这里我们可以分析出,字符串中只有一个左括号,在经过现有函数的筛选之后,根本没有右括号。
实际上就是左括号数量多于右括号的问题。
2.为此我们应该在最后检验栈中是否还有元素需用STEmpty(&st)这个函数。
bool isValid(char* s) {
ST st;
STInit(&st);
while (*s)
{
if (*s == '[' || *s == '{' || *s == '(')//如果是左括号则存入st
{
STPush(&st, *s);
}
else//如果是右括号则可以开始与st栈顶元素匹配
{
char top = STTop(&st);
STPop(&st);
if ((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
return false;
}
}
++s;
}
bool ret = STEmpty(&st);
STDestroy(&st);
return ret;
}
这样难道就正确了吗?结果我们提交:戏剧性一面出来了,而这里显然是刚才没有考虑全面
实际上就是右括号数量多于左括号的问题。
3.所以该如何检查右括号数量多于左括号的问题呢?让我们再回看代码,如果是右括号就会开始匹配,这时如果栈内已经空了呢?是不是应该直接返回false?
bool isValid(char* s) {
ST st;
STInit(&st);
while (*s)
{
if (*s == '[' || *s == '{' || *s == '(')//如果是左括号则存入st
{
STPush(&st, *s);
}
else//如果是右括号则可以开始与st栈顶元素匹配
{
//右括号比左括号多,数量匹配问题2
if (STEmpty(&st))
{
return false;
}char top = STTop(&st);
STPop(&st);
//这里进行顺序匹配
if ((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
return false;
}
}
++s;
}
//左括号比右括号多,数量匹配问题1
bool ret = STEmpty(&st);
STDestroy(&st);
return ret;
}
最后这道题就解决啦。
结语:
随着这篇关于题目解析的博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。解题的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。 你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容,让我们在知识的道路上共同前行。