📜  数据结构|堆叠问题2(1)

📅  最后修改于: 2023-12-03 15:10:20.139000             🧑  作者: Mango

数据结构 | 堆叠问题2

在计算机科学中,堆栈(stack)是一种基于后进先出(LIFO)原则的抽象数据类型,用作程序的临时性存储区。堆栈在函数调用时存储了返回地址、函数的局部变量等信息。对于堆栈,最基本的操作是压栈(push)和弹栈(pop),即向栈中添加元素或者从栈中移除元素。

堆栈可以使用数组或链表实现。此外,在一些编程语言中也提供了内置的堆栈支持。

堆栈的应用

堆栈能够方便地实现递归算法,因为递归算法本身就是一种基于堆栈的计算方式。此外,堆栈也常常用于括号、表达式、回溯等问题的解决。

堆栈代码示例

下面是一个使用数组实现堆栈的示例代码:

class Stack:
    def __init__(self):
        self.data = []

    def push(self, x):
        self.data.append(x)

    def pop(self):
        if self.empty():
            raise Exception("Stack is empty")
        return self.data.pop()

    def top(self):
        if self.empty():
            raise Exception("Stack is empty")
        return self.data[-1]

    def empty(self):
        return not self.data
堆栈问题示例
问题描述

给定一个字符串,其中包含三种括号字符 ()*,请编写一个函数,判断这个字符串能否通过加入一些空格变成一个合法的括号表达式。

注意:

  • 空字符串可转换为合法的括号表达式
  • 字符串的长度不超过 100
解决方案

可以使用两个堆栈,分别存储左括号(包括 (*)和星号。遍历字符串中的每个字符,如果是左括号或者星号,则将其放入相应的堆栈中;如果是右括号,则优先用左括号匹配,如果没有左括号则使用星号匹配,如果还没有星号则返回 False。遍历完字符串后,还需要将剩余的左括号与星号进行匹配,如果有未匹配的左括号则返回 False。

下面是 Python 代码实现:

class Solution:
    def checkValidString(self, s: str) -> bool:
        left_stack = []
        star_stack = []
        n = len(s)
        for i in range(n):
            c = s[i]
            if c == '(':
                left_stack.append(i)
            elif c == '*':
                star_stack.append(i)
            else:
                if left_stack:
                    left_stack.pop()
                elif star_stack:
                    star_stack.pop()
                else:
                    return False
        while left_stack and star_stack:
            if left_stack[-1] < star_stack[-1]:
                left_stack.pop()
                star_stack.pop()
            else:
                break
        return not left_stack

以上就是关于堆栈的一些基本介绍以及一个应用实例的解决方案。堆栈作为一种基本数据结构,在程序的实现中有着广泛的应用。