返回

LeetCode HOT 100:剖析经典栈数据结构解题之有效括号

前端

栈的数据结构

栈(Stack)是一种数据结构,它遵守先进先出(First In First Out,简称 FIFO)的原则。这意味着,第一个进入栈的元素(称为栈顶元素)将是第一个被移除的元素。栈的常见操作包括:

  • 压栈(push):将元素推入栈顶。
  • 出栈(pop):移除并返回栈顶元素。
  • 栈顶(top):返回栈顶元素,但不移除它。
  • 栈空(empty):检查栈是否为空。

栈在计算机科学中有很多应用,包括:

  • 表达式求值:栈可用于计算算术表达式的值,如:(3+4)*(5-2)。
  • 函数调用:栈可用于管理函数调用,当函数被调用时,它的参数、局部变量和返回地址会被压入栈中。当函数返回时,栈顶的这些信息会被弹出。
  • 递归:栈可用于实现递归,当函数调用自身时,它的参数和局部变量会被压入栈中。当递归调用返回时,栈顶的这些信息会被弹出。

有效括号的题目

LeetCode HOT 100中的有效括号题目如下:

给定一个只包含括号 '('')' 的字符串,判断它是否是有效的。

有效括号字符串需满足以下条件:

  • 开括号必须以相同数量的闭括号结尾。
  • 开括号必须以正确的顺序关闭。
  • 例如,"()""()[]{}" 是有效的,但 "(]", "([)]""(" 是无效的。

栈的解题思路

栈的数据结构非常适合解决有效括号的问题。我们可以使用一个栈来存储所有遇到的左括号,并将它们与遇到的右括号进行匹配。如果每个左括号都能找到一个与之匹配的右括号,那么该字符串就是有效的,否则就是无效的。

具体来说,我们可以使用以下步骤来解决这个问题:

  1. 初始化一个空栈。
  2. 遍历给定的字符串。
  3. 如果遇到左括号,则将其压入栈中。
  4. 如果遇到右括号,则检查栈是否为空。
    • 如果栈为空,则字符串无效,返回 false。
    • 如果栈不为空,则弹出栈顶的左括号。
  5. 如果遍历完整个字符串后,栈为空,则字符串有效,返回 true。
  6. 否则,字符串无效,返回 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 为字符串的长度。这是因为我们只需要遍历字符串一次,并且对于每个字符,我们最多只需要执行一个压栈或出栈操作。

总结

栈是一种非常重要的数据结构,在计算机科学中有很多应用。有效括号题目是栈结构的一个经典应用。通过剖析这道题目的解题思路,我们可以更好地理解栈的数据结构及其应用。