python实现堆栈与队列的方法

yizhihongxing

下面是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日

相关文章

  • python轮询机制控制led实例

    下面我将详细讲解“python轮询机制控制led实例”的完整攻略。 1. 轮询机制的概念和作用 轮询机制是指通过不断地循环查询某个状态来实现任务的执行。在实际编程中,轮询机制常被用于实现一些需要不断检测某个外部状态的任务,例如网络通讯、设备操作等。在这种情况下,我们往往需要通过轮询来获取外部状态的变化,并及时作出相应的响应。 在控制led实例的过程中,我们可…

    python 2023年5月19日
    00
  • Python制作一个仿QQ办公版的图形登录界面

    下面是Python制作一个仿QQ办公版的图形登录界面的完整攻略: 第一步:选择GUI库 制作图形登录界面需要使用Python的GUI库。常用的GUI库有Tkinter、PyQt、wxPython等。其中,Tkinter是Python默认自带的GUI库,使用方便,适合初学者。本攻略使用Tkinter进行制作。 第二步:设计登录界面 设计登录界面需要考虑UI风格…

    python 2023年6月5日
    00
  • Win10下Python环境搭建与配置教程

    Win10下Python环境搭建与配置教程 步骤一:下载并安装Python 在官网下载Windows版本的Python,选择相应的版本下载安装包。 运行安装包,勾选“Add Python to PATH”选项,点击“Install Now”进行安装。 安装完成后,在命令提示符(cmd)中输入python –version检查是否安装成功。 步骤二:配置环境…

    python 2023年5月14日
    00
  • Python实现七大查找算法的示例代码

    Python实现七大查找算法的示例代码 查找算法是计算机科学中的一个重要问题。本文将介绍Python现七大查找算法的示例代码,包括线性查找、二分查找插值查找、斐波那契查找、树表查找、哈希查找和跳跃表查找。 线性查找 线性查找一种简单的查找算法,适用于小型数据集。该算法从数据集的第一个元素开始,逐个比较每个元素,直到找到标元素或遍历完整个数据。 以下是Pyth…

    python 2023年5月14日
    00
  • 简单实现python聊天程序

    简单实现Python聊天程序攻略 第一步 – 确定聊天方式 在开始编写Python聊天程序之前,首先需要确立用户之间聊天的方式。可以通过几种不同的方法实现: 使用Sockets – 编写Python程序以通过使用套接字实现两个之间的通信。 使用HTTP – 实现客户端-服务器程序,通过使用HTTP协议处理请求和响应。 使用WebSocket – 使用更复杂的…

    python 2023年5月19日
    00
  • python requests.post带head和body的实例

    以下是关于Python requests.post带head和body的实例的攻略: Python requests.post带head和body的实例 在使用Python requests.post发送请求时,可以带有head和body参数。以下是Python requests.post带head和body的实例的攻略。 发送带有head和body的POS…

    python 2023年5月15日
    00
  • Python 中的with关键字使用详解

    当我们在 Python 中读写文件或者操作数据库等资源时,为了确保资源能够被及时释放并且避免出现潜在的异常问题,我们可以使用with关键字。本文将详细讲解with关键字的使用方法。 1. with关键字的语法 with关键字的基本语法如下所示: with expression [as variable]: with-block with语句块会为这个表达式创…

    python 2023年6月3日
    00
  • python爬虫lxml库解析xpath网页过程示例

    Python爬虫lxml库解析XPath网页过程示例 在Python中,我们可以使用第三方库lxml和XPath来解析HTML和XML页面。本文将详细讲解如何使用lxml和XPath实现网页解析,并提供两个示例。 步骤1:安装lxml库 在使用lxml库之前,我们需要安装它。您可以使用以下命令安装lxml库: pip install lxml 步骤2:使用l…

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