python实现堆栈与队列的方法

下面是Python实现堆栈和队列的方法完整攻略,包含两条示例说明。

堆栈

什么是堆栈

堆栈是一种特殊的数据结构,其中新元素总是被添加到一端,该端被称为 “栈顶”,而现有元素只能从该端移除。由于新元素添加到栈顶,因此最后一个添加到栈内的元素第一个被移除,所以堆栈遵循了先进后出 (LIFO) 的原则。

如何实现堆栈

在 Python 中,使用列表 (list) 就可以轻易地实现堆栈。

堆栈的创建与初始化

stack = [] # 创建一个空栈

堆栈的入栈操作

使用 Python 列表的 append() 方法将新元素添加到栈顶。

stack.append(element)

堆栈的出栈操作

使用 Python 列表的 pop() 方法来移除位于栈顶的元素。

stack.pop()

判断堆栈是否为空

使用 Python 列表的特性,可以通过以下代码来判断堆栈是否为空:

if not stack:
    print("栈为空")

堆栈的示例问题

示例问题:判断一组括号表达式是否匹配。

例如:对于表达式 ()[]{},我们可以发现每个左括号都有与之匹配的右括号,因此它是有效的。但是仅有左括号或者左右括号顺序不正确的表达式,如 [)(],都是无效的。

使用堆栈可以轻松解决这个问题。

def is_valid(s: str) -> bool:
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

解释:

  • 创建一个空栈和一个映射字典,字典的键为右括号,值为左括号;
  • 遍历表达式中的每个字符;
  • 如果当前字符是右括号,那么弹出堆栈中的栈顶元素,如果栈顶元素与该右括号所对应的左括号不匹配,则该表达式无效;
  • 如果当前字符是左括号,将其入栈;
  • 遍历完成后,如果堆栈中还有剩余元素,说明表达式无效,否则合法。

队列

什么是队列

队列是另一种重要的数据结构。与堆栈不同的是,队列中新元素总是加入到队列末尾,而现有元素总是被删除队列头部,同时队列遵循了先进先出 (FIFO) 的原则。

如何实现队列

在 Python 中,我们也可以使用列表来轻松实现队列。

队列的创建与初始化

queue = [] # 创建一个空队列

队列的入队操作

使用 Python 列表的 append() 方法将新元素添加到队列末尾。

queue.append(element)

队列的出队操作

使用 Python 列表的 pop() 方法来移除位于队列头部的元素。

queue.pop(0)

判断队列是否为空

与堆栈类似,使用 Python 列表的特性,可以通过以下代码来判断队列是否为空:

if not queue:
    print("队列为空")

队列的示例问题

示例问题:实现一个队列,要求该队列可以在给定时间限制内获取一个最大值。

例如:当给定一个队列 [1, 3, -1, -3, 5, 3, 6, 7] 和时间限制 k = 3 时,要求在每 3 个元素形成一个子序列的前提下,获取该子序列的最大值,并将所有最大值存储到一个列表中。

from collections import deque

def max_sliding_window(nums, k):
    n = len(nums)
    if n * k == 0:
        return []
    if k == 1:
        return nums

    def clean_deque(i):
        # 清除失效的窗口
        if deque and deque[0] == i - k:
            deque.popleft()

        # 清除小于新元素的数字
        while deque and nums[i] > nums[deque[-1]]:
            deque.pop()

    # 计算第一个窗口的最大值
    max_idx = 0
    for i in range(k):
        clean_deque(i)
        deque.append(i)
        if nums[i] > nums[max_idx]:
            max_idx = i
    output = [nums[max_idx]]

    # 遍历所有的窗口
    for i in range(k, n):
        clean_deque(i)
        deque.append(num)
        output.append(nums[deque[0]])
    return output

解释:

  • 定义一个双端队列 deque 来记录当前窗口中最大数字的位置;
  • 随着窗口向右移动,删除滑动窗口超过 k 的元素并清除小于新元素的数字;
  • 在每个窗口移动前,将该窗口内的所有数字添加到 deque 中,并记录其中的最大值;
  • 记录每个窗口的最大值,并将其添加到输出列表中。

这个算法的时间复杂度是 $O(n)$,空间复杂度是 $O(k)$。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现堆栈与队列的方法 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • pytorch dataloader 取batch_size时候出现bug的解决方式

    在使用 PyTorch 进行深度学习模型训练时,数据的载入和预处理是非常重要的一步。PyTorch 中提供了 Dataloader 预先加载数据,方便了我们对数据集进行分批操作,加快了模型的训练速度。不过在使用 Dataloader 进行分批处理时,我们也可能会遇到一些问题,比如取 batch_size 的时候出现 bug。 具体来说,当我们使用 Datal…

    python 2023年6月3日
    00
  • 无法使用 python [requests, roboBrowser] 登录网站

    【问题标题】:Can’t login to website using python [requests, roboBrowser]无法使用 python [requests, roboBrowser] 登录网站 【发布时间】:2023-04-07 06:19:01 【问题描述】: 我已经环顾一周了。我找到的所有答案要么已过时,要么不起作用。 我正在尝试登录…

    Python开发 2023年4月8日
    00
  • 如何在Python中更新MySQL数据库中的数据?

    以下是在Python中更新MySQL数据库中的数据的完整使用攻略。 使用MySQL数据库的前提条件 在使用Python连接MySQL数据库之前,确保已经安装了MySQL数据库,并已经创建使用数据库和表。同时,还需要安装Python的驱动程序,例如mysql-connector-python。 步骤1:导入模块 在Python中使用mysql.connecto…

    python 2023年5月12日
    00
  • Gauss-Seidel迭代算法的Python实现详解

    下面是详细讲解“Gauss-Seidel迭代算法的Python实现详解”的完整攻略,包括算法原理、Python实现和两个示例。 算法原理 Gauss-Seidel迭代法是一种求解线性方程组的方法,其基本思想是通过不断迭代,逐步逼近方程组的解。算的具体步骤如下: 将线性方程组表示为矩阵形式; 对矩阵进行分解,得下三角矩阵L、对角矩阵D和上三角矩阵U; 将方程表…

    python 2023年5月14日
    00
  • python实现门限回归方式

    门限回归(threshold regression)是一种分类回归技术,可以将数据集分成两个或多个不同组。门限回归可以用于分类问题或者将数据分成不同的组,在每个组中建立不同的回归模型。本文将讲解如何使用Python实现门限回归。 准备工作 在开始实现门限回归之前,需要在Python中安装相关的库,其中最重要的是statsmodels库。下面是安装statsm…

    python 2023年5月19日
    00
  • 如何基于python对接钉钉并获取access_token

    下面详细讲解如何基于Python对接钉钉并获取access_token的完整攻略。 一、准备工作 在开始之前,需要先进行以下准备工作:1. 拥有自己的钉钉企业号,并且至少有一个管理员账号。2. 注册好自己的企业应用,在应用管理后台获取到AppKey和AppSecret。3. 安装好 Python 环境,可以使用 pip 安装第三方依赖库。 二、获取acces…

    python 2023年6月3日
    00
  • Python 可视化matplotlib模块基础知识

    Matplotlib是Python中最流行的可视化库之一,可以帮助我们创建各种类型的图表,包括折线图、散点图、柱状图等。本文将详细讲解Matplotlib模块的基础知识,包括如何安装、如何创建图表、如何设置图表属性等。 安装Matplotlib 要使用Matplotlib,我们需要先安装Matplotlib模块。以下是一个示例,演示如何使用pip安装Matp…

    python 2023年5月15日
    00
  • python中sys.argv函数精简概括

    关于”python中sys.argv函数精简概括”的详细讲解,请看下面的攻略。 什么是sys.argv函数? sys.argv是一种Python内置的命令行参数解析模块,它用于从命令行中获取参数。sys.argv是一个包含命令行参数的列表,其中第一个元素是脚本的名称本身。 使用sys.argv函数的基本方法 我们来看一下sys.argv的基本使用方法。需要在…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部