返回

剖析LeetCode算法学习系列--stack--有效括号:栈的精妙应用

前端

栈的简介

栈是一种先进后出的线性数据结构,遵循“后进先出”(Last In First Out,简写为LIFO)的原则。想象一下,栈就像一个摞着盘子的架子,新的盘子总是放在最上面,而当我们需要取盘子时,我们总是从最上面取。栈具有以下基本操作:

  • push:将元素压入栈顶
  • pop:从栈顶弹出元素
  • peek:查看栈顶元素
  • isEmpty:判断栈是否为空

有效括号

LeetCode中“有效括号”这道题要求我们判断一个字符串中的括号是否有效匹配。有效匹配的定义如下:

  • 圆括号“()”必须成对出现,且必须以正确的顺序嵌套。
  • 方括号“[]”必须成对出现,且必须以正确的顺序嵌套。
  • 大括号“{}”必须成对出现,且必须以正确的顺序嵌套。

任何不符合以上规则的括号组合都是无效的。

解法一:使用stack解决有效括号问题

要解决有效括号问题,我们可以使用stack数据结构。具体步骤如下:

  1. 初始化一个stack,将所有左括号压入stack中。
  2. 遍历字符串,逐个字符进行判断:
    • 如果遇到左括号,则将其压入stack中。
    • 如果遇到右括号,则从stack中弹出栈顶元素。如果栈顶元素与当前右括号匹配,则继续遍历;否则,返回false。
  3. 遍历结束,如果stack为空,则返回true;否则,返回false。

示例:Python代码实现

def is_valid_parentheses(s):
  """
  判断一个字符串中的括号是否有效匹配。

  参数:
    s:输入字符串

  返回:
    True:括号匹配有效
    False:括号匹配无效
  """

  # 初始化一个栈
  stack = []

  # 遍历字符串,逐个字符进行判断
  for char in s:
    # 如果遇到左括号,则将其压入stack中
    if char in "([{":
      stack.append(char)

    # 如果遇到右括号,则从stack中弹出栈顶元素
    elif char in ")]}":
      if not stack:
        return False

      top = stack.pop()

      # 如果栈顶元素与当前右括号匹配,则继续遍历
      if (top == "(" and char == ")") or (top == "[" and char == "]") or (top == "{" and char == "}"):
        continue
      else:
        return False

  # 遍历结束,如果stack为空,则返回true;否则,返回false
  return not stack

解法二:使用双指针解决有效括号问题

除了使用stack,我们还可以使用双指针的方法来解决有效括号问题。具体步骤如下:

  1. 初始化两个指针,left和right,分别指向字符串的开头和结尾。
  2. 当left和right指向同一位置时,停止遍历。
  3. 如果left指向左括号,则将right指针向右移动,直到遇到匹配的右括号。
  4. 如果left指向右括号,则将left指针向左移动,直到遇到匹配的左括号。
  5. 重复步骤3和步骤4,直到left和right指向同一位置。

示例:C++代码实现

bool is_valid_parentheses(string s) {
  int left = 0, right = s.size() - 1;

  while (left <= right) {
    if (s[left] == '(' && s[right] == ')') {
      left++;
      right--;
    } else if (s[left] == '[' && s[right] == ']') {
      left++;
      right--;
    } else if (s[left] == '{' && s[right] == '}') {
      left++;
      right--;
    } else {
      return false;
    }
  }

  return true;
}

总结

LeetCode中的“有效括号”问题是一个经典的算法问题,也是算法面试中经常出现的问题。通过这道题,我们学习了stack数据结构的基本操作和应用,以及双指针的技巧。希望这篇博文对您学习算法有所帮助。

常见问题解答

  • Q:stack是什么?

A:stack是一种先进后出的线性数据结构,遵循“后进先出”(Last In First Out,简写为LIFO)的原则。

  • Q:如何判断一个字符串中的括号是否有效匹配?

A:可以使用stack数据结构或双指针的方法来判断。

  • Q:stack的基本操作有哪些?

A:stack的基本操作包括push、pop、peek和isEmpty。

  • Q:stack的优缺点是什么?

A:stack的优点是简单易用,空间利用率高;缺点是顺序访问困难,不能直接访问中间元素。

  • Q:stack的常见应用场景有哪些?

A:stack的常见应用场景包括括号匹配、函数调用、递归、深度优先搜索等。