题目描述:20. 有效的括号 - 力扣(LeetCode)
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解题思路:
当解决有效的括号问题时,我们需要使用一种数据结构来检查括号的闭合顺序。栈(Stack)是一个非常适合这个问题的数据结构,因为它遵循"后进先出"(Last In First Out,LIFO)的原则,与括号的嵌套结构相符。
-
首先,我们创建一个空栈,用于存储括号字符。
-
遍历输入的字符串
s
中的每个字符:- 如果字符是开括号('(', '{', '['),将其推入栈中。
- 如果字符是闭括号(')', '}', ']'),我们需要检查栈是否为空:
- 如果栈为空,表示没有对应的开括号与之匹配,返回 False。
- 如果栈不为空,则从栈顶弹出一个元素,并与当前字符对应的开括号进行匹配。如果不匹配,返回 False。
-
当遍历完所有字符后,检查栈是否为空:
- 如果栈为空,表示所有的括号都已经正确闭合,返回 True。
- 如果栈不为空,表示还有未闭合的括号,返回 False。
注:
-
如果字符是闭括号(')', '}', ']'),我们为什么需要检查栈是否为空?
如果不检查栈为空时,遇到右括号直接进行从栈顶弹出一个元素,会造成越界访问。
同时,也要注意在返回之前一定要free开辟的空间,否则会造成内存泄漏:
其对应的情况可能是:
①遇到第一个括号是右括号,此时栈为空,没有进行开辟空间,直接返回不会造成内存泄漏;
②如果情况是:'(', '{', '}',')', ']'-->当遇到右括号‘]’时,栈中没有元素,栈为空,但是栈所用的空间没有free,此时如果没有free直接返回,就会造成内存泄漏。(就相当于,你买一瓶矿泉水,你把水喝完后,瓶子还在)
-
当遍历完所有字符后,为什么要检查栈是否为空?
要应对的情况是:
①'[', '(', '{', '}',')' 当右括号 '}',')' 都匹配完后,栈中还剩下'[',则说明'['没有右括号与其匹配;
②全是左括号的情况。
代码:
bool isValid(char * s)
{
Stack stack;
StackInit(&stack);
while(*s)
{
// 如果是左括号,就入栈
if(*s=='(' || *s=='{' || *s=='[')
{
StackPush(&stack, *s);
s++;
}
else // 如果是右括号,就出栈匹配
{
// 遇到右括号时,但是栈为空,说明没有左括号与其匹配
if(StackEmpty(&stack))
{
StackDestroy(&stack);
return false;
}
STDataType temp = StackTop(&stack);
StackPop(&stack);
if((*s==')' && temp!='(') ||
(*s==']' && temp!='[') ||
(*s=='}' && temp!='{'))
{
StackDestroy(&stack);
return false;
}
else
{
s++;
}
}
}
// 如果栈中不是空,说明栈中还有左括号,有左括号没有匹配(全是左括号)
bool ret = StackEmpty(&stack);
StackDestroy(&stack);
return ret;
}
这种算法的时间复杂度是 O(n),其中 n 是输入字符串的长度,因为我们需要遍历一次输入字符串。空间复杂度是 O(n),因为最坏情况下,栈中可能需要存储所有的字符。
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……