返回

栈的妙用:轻松搞定括号匹配问题

前端

一、栈的数据结构

栈是一种后进先出(Last In First Out, LIFO)的数据结构,这意味着最后加入栈中的元素将第一个被移除。栈的实现方式有很多种,但最常见的是使用数组或链表。

  • 数组实现的栈:
class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def is_empty(self):
        return self.items == []
  • 链表实现的栈:
class StackNode:
    def __init__(self, data):
        self.data = data
        self.next = None

class Stack:
    def __init__(self):
        self.head = None

    def push(self, item):
        new_node = StackNode(item)
        new_node.next = self.head
        self.head = new_node

    def pop(self):
        if self.head is None:
            return None
        item = self.head.data
        self.head = self.head.next
        return item

    def peek(self):
        if self.head is None:
            return None
        return self.head.data

    def is_empty(self):
        return self.head is None

二、利用栈解决括号匹配问题

括号匹配问题是计算机科学中的一个经典问题。给定一个字符串,其中包含括号(圆括号、方括号和大括号),判断这些括号是否匹配。例如,字符串 "()" 是有效的,因为括号匹配;而字符串 "([)]" 是无效的,因为括号不匹配。

我们可以利用栈来解决括号匹配问题。算法的思路如下:

  1. 初始化一个栈。
  2. 遍历字符串中的每个字符。
  3. 如果遇到左括号,则将其压入栈中。
  4. 如果遇到右括号,则检查栈顶元素是否与当前右括号匹配。如果匹配,则将栈顶元素弹出;如果不匹配,则说明括号不匹配。
  5. 重复步骤 2 和步骤 3,直到遍历完整个字符串。
  6. 如果栈为空,则说明括号匹配;否则,说明括号不匹配。

下面是利用栈解决括号匹配问题的 Python 代码:

def is_valid_parentheses(s):
    """
    判断括号是否匹配。

    参数:
        s (str): 输入的字符串。

    返回:
        bool: 括号是否匹配。
    """

    # 初始化栈
    stack = []

    # 遍历字符串中的每个字符
    for char in s:
        # 如果遇到左括号,则将其压入栈中
        if char in "([{":
            stack.append(char)
        # 如果遇到右括号,则检查栈顶元素是否与当前右括号匹配
        elif char in ")]}":
            # 如果匹配,则将栈顶元素弹出
            if char == ")" and stack[-1] == "(":
                stack.pop()
            elif char == "]" and stack[-1] == "[":
                stack.pop()
            elif char == "}" and stack[-1] == "{":
                stack.pop()
            # 如果不匹配,则说明括号不匹配
            else:
                return False

    # 如果栈为空,则说明括号匹配;否则,说明括号不匹配
    return stack == []

三、结语

栈是一种非常重要的数据结构,它在计算机科学中有着广泛的应用。在这篇文章中,我们介绍了栈的数据结构,并利用栈来解决 leetcode 20. 有效的括号 的问题。通过这篇文章,您应该已经对栈的数据结构有了一个基本的了解,并且能够利用栈来解决一些简单的问题。