返回
LeetCode HOT 100:剖析经典栈数据结构解题之有效括号
前端
2023-10-03 10:06:23
栈的数据结构
栈(Stack)是一种数据结构,它遵守先进先出(First In First Out,简称 FIFO)的原则。这意味着,第一个进入栈的元素(称为栈顶元素)将是第一个被移除的元素。栈的常见操作包括:
- 压栈(push):将元素推入栈顶。
- 出栈(pop):移除并返回栈顶元素。
- 栈顶(top):返回栈顶元素,但不移除它。
- 栈空(empty):检查栈是否为空。
栈在计算机科学中有很多应用,包括:
- 表达式求值:栈可用于计算算术表达式的值,如:(3+4)*(5-2)。
- 函数调用:栈可用于管理函数调用,当函数被调用时,它的参数、局部变量和返回地址会被压入栈中。当函数返回时,栈顶的这些信息会被弹出。
- 递归:栈可用于实现递归,当函数调用自身时,它的参数和局部变量会被压入栈中。当递归调用返回时,栈顶的这些信息会被弹出。
有效括号的题目
LeetCode HOT 100中的有效括号题目如下:
给定一个只包含括号
'('
和')'
的字符串,判断它是否是有效的。
有效括号字符串需满足以下条件:
- 开括号必须以相同数量的闭括号结尾。
- 开括号必须以正确的顺序关闭。
- 例如,
"()"
和"()[]{}"
是有效的,但"(]"
,"([)]"
和"("
是无效的。
栈的解题思路
栈的数据结构非常适合解决有效括号的问题。我们可以使用一个栈来存储所有遇到的左括号,并将它们与遇到的右括号进行匹配。如果每个左括号都能找到一个与之匹配的右括号,那么该字符串就是有效的,否则就是无效的。
具体来说,我们可以使用以下步骤来解决这个问题:
- 初始化一个空栈。
- 遍历给定的字符串。
- 如果遇到左括号,则将其压入栈中。
- 如果遇到右括号,则检查栈是否为空。
- 如果栈为空,则字符串无效,返回 false。
- 如果栈不为空,则弹出栈顶的左括号。
- 如果遍历完整个字符串后,栈为空,则字符串有效,返回 true。
- 否则,字符串无效,返回 false。
代码实现
def is_valid(s):
stack = []
for char in s:
if char in '([{':
stack.append(char)
else:
if not stack:
return False
top = stack.pop()
if (char == ')' and top != '(') or (char == ']' and top != '[') or (char == '}' and top != '{'):
return False
return not stack
时间复杂度分析
上述算法的时间复杂度为 O(n),其中 n 为字符串的长度。这是因为我们只需要遍历字符串一次,并且对于每个字符,我们最多只需要执行一个压栈或出栈操作。
总结
栈是一种非常重要的数据结构,在计算机科学中有很多应用。有效括号题目是栈结构的一个经典应用。通过剖析这道题目的解题思路,我们可以更好地理解栈的数据结构及其应用。