首页 > 编程语言 >python中的队列

python中的队列

时间:2025-01-06 17:11:49浏览次数:1  
标签:node deque python queue 队列 window append

在 Python 中,队列(Queue)是一种常见的数据结构,特别是在刷算法题时经常被用到。以下是队列相关的基础语法及其在算法题中的应用总结。


1. 队列的基本定义

队列遵循 FIFO(先进先出) 原则,可以通过以下方式实现:

1) collections.deque

deque 是双端队列,支持快速的两端插入和删除操作。

from collections import deque

# 初始化队列
queue = deque()

# 入队
queue.append(1)  # 队尾插入
queue.append(2)

# 出队
x = queue.popleft()  # 队首弹出

# 检查队列是否为空
if not queue:
    print("Queue is empty")

2) queue.Queue

标准库中的线程安全队列,适合多线程场景。

from queue import Queue

# 初始化队列
queue = Queue()

# 入队
queue.put(1)
queue.put(2)

# 出队
x = queue.get()

# 检查队列是否为空
if queue.empty():
    print("Queue is empty")

2. 队列常见操作

1) 初始化队列

从列表初始化队列:

data = [1, 2, 3, 4]
queue = deque(data)

2) 队列长度

获取队列长度:

length = len(queue)

3) 清空队列

清空队列内容:

queue.clear()

4) 双端操作

deque 支持双端队列操作:

# 队首插入
queue.appendleft(0)

# 队尾弹出
x = queue.pop()

3. 算法题中队列的常用场景

1) 广度优先搜索(BFS)

队列是实现 BFS 的核心数据结构,常用于图遍历、最短路径等问题。

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    visited.add(start)

    while queue:
        node = queue.popleft()
        print(node)  # 访问节点

        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)

2) 滑动窗口问题

在滑动窗口中,队列常用来维护窗口中的元素或其索引。

from collections import deque

def max_sliding_window(nums, k):
    deque_window = deque()
    result = []

    for i, num in enumerate(nums):
        # 移除窗口外的元素
        if deque_window and deque_window[0] == i - k:
            deque_window.popleft()

        # 保持队列单调递减,移除比当前元素小的
        while deque_window and nums[deque_window[-1]] < num:
            deque_window.pop()

        deque_window.append(i)

        # 记录窗口的最大值
        if i >= k - 1:
            result.append(nums[deque_window[0]])

    return result

3) 拓扑排序

利用队列维护入度为 0 的节点,用于有向图的拓扑排序。

from collections import deque

def topological_sort(graph, indegree):
    queue = deque([node for node in graph if indegree[node] == 0])
    result = []

    while queue:
        node = queue.popleft()
        result.append(node)

        for neighbor in graph[node]:
            indegree[neighbor] -= 1
            if indegree[neighbor] == 0:
                queue.append(neighbor)

    return result if len(result) == len(graph) else []

4) 多源 BFS

处理多个起点同时进行的 BFS 问题,比如火焰蔓延、病毒扩散等问题。

from collections import deque

def multi_source_bfs(grid):
    rows, cols = len(grid), len(grid[0])
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    queue = deque()

    # 将所有起点加入队列
    for r in range(rows):
        for c in range(cols):
            if grid[r][c] == 2:  # 起点条件
                queue.append((r, c))

    while queue:
        x, y = queue.popleft()
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 0:
                grid[nx][ny] = grid[x][y] + 1
                queue.append((nx, ny))

4. 优先队列

在需要按照优先级弹出元素的场景中,可以使用 heapq 实现最小堆(优先队列)。

import heapq

def process_priority_queue(data):
    pq = []
    for item in data:
        heapq.heappush(pq, item)  # 入堆

    while pq:
        print(heapq.heappop(pq))  # 出堆

若需要最大堆,可以将元素取反:

pq = []
heapq.heappush(pq, -1 * value)  # 插入负值
max_val = -1 * heapq.heappop(pq)  # 弹出负值并取反

5. 队列技巧总结

  1. 广度优先搜索(BFS):核心应用场景,用于图论、最短路径、层序遍历等。
  2. 双端队列:滑动窗口、单调队列等问题的利器,支持高效的两端操作。
  3. 优先队列:解决需要动态维护最大值或最小值的场景,如 Huffman 编码、Dijkstra 算法等。
  4. 队列与递归结合:部分问题可以用队列替代递归,避免栈溢出。
  5. 灵活初始化:从数组、起点集合快速构建队列,加速算法实现。

通过这些队列操作,刷算法题中涉及队列的数据结构问题会更加顺畅!

标签:node,deque,python,queue,队列,window,append
From: https://www.cnblogs.com/lmc7/p/18655739

相关文章

  • (2024最新毕设合集)基于Django的电影资讯共享平台-10223|可做计算机毕业设计JAVA、PHP、
    目录摘要Abstract1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2电影资讯共享平台系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3 社会可行性2.1.4法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.......
  • DL00564-图卷积神经网络GCN心电图信号ECG心律失常检测python完整代码
    图卷积神经网络(GraphConvolutionalNetwork,GCN)作为一种图神经网络(GraphNeuralNetwork,GNN)的代表,近年来在各类数据结构上表现出了优异的性能,尤其是在处理具有图结构数据时。心电图(ECG,Electrocardiogram)信号分析,特别是心律失常的检测,是医学信号处理中一个重要且挑战性的任务......
  • Python开发环境部署教程
    本教程将详细介绍如何在Windows系统上配置Python开发环境,包括安装Python、配置虚拟环境以及使用VSCode进行开发,适合新手和需要精细配置的开发者。1.安装Python1.1下载Python访问Python官网.选择最新版本的Python进行下载(建议下载64-bit版本)。1.2判断选......
  • C#基于pythonnet调用Python的pyd文件,实现交互
    privatevoidTestPython(){try{//python环境路径stringpathToVirtualEnv=@"H:\ProgramData\anaconda3\envs\python39";Environment.SetEnvironmentVariable("PATH",pathToVirtualEnv,EnvironmentVari......
  • python毕设 高校快递代取系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校快递代取系统的研究,现有研究多侧重于快递代取服务的基本流程与效率提升方面。专门针对高校这一特殊环境下,综合考虑用户、快递......
  • python毕设 新能源汽车租赁与电池更换系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着全球对环境保护和可持续发展的关注日益增加,新能源汽车作为一种环保、高效的交通工具得到了广泛的推广和应用。在国内,新能源汽车产......
  • 2024实测验证可用的股票数据接口集合:python、JavaScript 、JAVA等实例代码演示教你如
    最近一两年,股票量化分析越来越受欢迎了。想要入行,首先得搞定股票数据。毕竟,所有量化分析都是建立在数据之上的,实时交易、历史交易、财务、基本面,这些数据咱们都得有。咱们的目标就是挖掘这些数据中的价值,来指导咱们的投资策略。为了找数据,我可是尝试了各种方法,自己动手写过......
  • 动手学深度学习-python基础知识介绍part1
    基础详解-part1importtorchx=torch.arange(12)xx.shapex.numel()#数组中元素的总数#修改形状x.reshape(3,4)torch.zeros((2,3,4))#两层,三行,四列print(torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]).shape)#二维#两个框表示二维,三个表示三维print(torch.tens......
  • C#基于pythonnet调用Python的pyd文件,实现交互
    privatevoidTestPython(){try{//python环境路径stringpathToVirtualEnv=@"H:\ProgramData\anaconda3\envs\python39";Environment.SetEnvironmentVariable("PATH",pathToVirtualEnv,EnvironmentVari......
  • Python中的 多维列表、锯齿数组
    多维列表(模拟多维数组)定义:通过嵌套列表来创建多维列表。下面以三维列表为例。访问:使用多个索引访问列表中的元素,索引从0开始。销毁:Python有垃圾回收机制,当多维列表不再被引用时,内存会被自动回收。#定义一个三维列表,大小为2x3x4multiDimList=[[[0for_inrange(4)]fo......