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日

相关文章

  • 解决python3中解压zip文件是文件名乱码的问题

    下面是详细讲解“解决python3中解压zip文件是文件名乱码的问题”的完整攻略。 问题描述 在Python3中解压zip文件时,有时会遇到文件名乱码的问题。这是因为Python3采用的是Unicode编码,而zip文件中的文件名可能不是Unicode编码,因此出现了乱码。 解决方案 解决这个问题的方法是在解压之前,重新编码文件名,使其转换为Unicode编…

    python 2023年5月20日
    00
  • Python中的布尔类型bool

    当我们需要进行判断时,布尔类型(bool)就显得尤为重要。Python 中的布尔类型是 True 和 False,可以理解为真和假。 布尔类型的基本使用 在 Python 中,可以用 bool() 把一个值转换为布尔类型。 >>> bool(1) True >>> bool(0) False >>> bo…

    python 2023年5月14日
    00
  • 浅谈matplotlib 绘制梯度下降求解过程

    浅谈matplotlib 绘制梯度下降求解过程 1. 简介 在机器学习中,梯度下降算法是十分常用的优化算法。在使用梯度下降算法时,我们通常会关注到每一步的变化过程,以便更好地理解算法的表现及收敛速度。因此,使用matplotlib可视化梯度下降过程十分有助于我们理解算法。 2. 绘制梯度下降过程 在Python中,我们可以使用matplotlib库绘制梯度下…

    python 2023年5月18日
    00
  • 详解Python中matplotlib模块的绘图方式

    下面是详解Python中matplotlib模块的绘图方式的完整攻略。 一、Matplotlib概述 Matplotlib是Python的一个开源绘图库,提供了丰富的绘图工具,可用于绘制各种静态、动态、交互式的图表、图形和可视化。Matplotlib的设计目标是简单易用,同时支持多种输出格式,如图片、PDF、SVG等,并且可兼容NumPy数组和Pandas数…

    python 2023年5月19日
    00
  • Python实现上传Minio和阿里Oss文件

    下面是关于Python实现上传Minio和阿里OSS文件的攻略,包含了两个实例说明。 Minio 安装Minio Minio是一款轻量级的对象存储解决方案,易于使用和部署。首先需要在本地或服务器上安装Minio,安装方式可参考官方文档 https://docs.min.io/cn/minio-quickstart-guide.html。 Python SDK…

    python 2023年6月3日
    00
  • Python爬虫之超级鹰验证码应用

    超级鹰是一种常用的验证码识别服务,可以帮助我们自动识别网站上的验证码。本攻略将介绍如何使用Python爬虫和超级鹰验证码识别服务来自动化处理验证码。 1. 注册超级鹰账号 首先,我们需要注册一个超级鹰账号。注册地址为:http://www.chaojiying.com/user/reg/ 注册成功后,我们需要购买一些验证码识别点数。超级鹰提供了不同的点数套餐…

    python 2023年5月15日
    00
  • python制作小说爬虫实录

    Python制作小说爬虫实录 前言 在互联网的信息化时代,越来越多的人选择读取网络上发布的小说来进行休闲和娱乐。而Python语言在爬虫技术方面表现出了很大的优势,因此我们可以利用Python语言来进行小说爬虫实现,让读者能够像在阅读小说网站一样去阅读自己指定的小说内容,从而让我们更加方便地获取小说内容进行阅读。 实现步骤 分析网站的HTML页面结构,提取需…

    python 2023年5月14日
    00
  • Python语言编写电脑时间自动同步小工具

    以下是Python语言编写电脑时间自动同步小工具的完整攻略: 1. 确定要使用的库 在Python中,有一个time库可以用于获取系统时间和进行时间转换,因此我们可以使用它来完成我们的小工具。同时,我们还需要使用socket库来实现与NTP服务器之间的通信。可以使用以下代码导入这两个库: import time import socket 2. 连接NTP服…

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