当前位置: 首页 > news >正文

数据结构编程实践20讲(Python版)—04队列

本文目录

    • 04 队列 Queue
      • S1 说明
      • S2 示例
        • 普通队列
        • 循环队列
        • 双端队列
        • 优先队列
      • S3 问题:基于普通队列实现的打印机任务管理
        • Python3程序
      • S4 问题:使用循环队列管理玩家移动轨迹
        • Python3程序
      • S5 问题:使用双端队列来管理文档操作历史
        • Python3程序
      • S6 问题:使用优先队列管理车辆调度
        • Python3程序

往期链接

01 数组02 链表03 栈

04 队列 Queue

S1 说明

队列是一种先进先出(FIFO,First In First Out)的数据结构。数据在队列中的插入操作称为入队(enqueue),而删除操作称为出队(dequeue)。队列的特性和分类如下:

特征

  • FIFO:最早进入队列的元素最先被移除。
  • 动态大小:队列的大小可以根据需要动态扩展,具体取决于实现方式。
  • 两端操作:通常只在队列的前端进行出队操作,在后端进行入队操作。

分类

  • 普通队列:基本的FIFO队列。
  • 循环队列:为了优化空间使用,使用循环数组实现的队列。
  • 双端队列(Deque):可以在两端进行插入和删除操作。
  • 优先队列:根据优先级进行出队的队列,出队的元素不一定是最早入队的元素。

S2 示例

普通队列

(1)基于collections包实现

from collections import dequequeue = deque()
queue.append('A')  # 入队
queue.append('B')  # 入队
print(queue.popleft())  # 出队
print(queue.popleft())  # 出队

结果

A
B

(2)基于python列表实现

class Queue:def __init__(self):self.queue = []def enqueue(self, item):self.queue.append(item)print(f"入队: {item}")def dequeue(self):if not self.is_empty():item = self.queue.pop(0)print(f"出队: {item}")return itemprint("队列为空,无法出队")return Nonedef is_empty(self):return len(self.queue) == 0def display(self):print("队列内容:", " <- ".join(map(str, self.queue)))# 示例
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.dequeue()
q.display()

结果

入队: 1
入队: 2
出队: 1
队列内容: 2
循环队列

使用固定大小的数组实现循环队列

class CircularQueue:def __init__(self, capacity):self.capacity = capacityself.queue = [None] * capacityself.front = -1self.rear = -1def is_empty(self):return self.front == -1def is_full(self):return (self.rear + 1) % self.capacity == self.frontdef enqueue(self, item):if self.is_full():print("队列已满,无法入队")returnif self.is_empty():self.front = 0self.rear = (self.rear + 1) % self.capacityself.queue[self.rear] = itemprint(f"入队: {item}")def dequeue(self):if self.is_empty():print("队列为空,无法出队")return Noneitem = self.queue[self.front]if self.front == self.rear:  # 队列只剩一个元素self.front = self.rear = -1else:self.front = (self.front + 1) % self.capacityprint(f"出队: {item}")return itemdef display(self):if self.is_empty():print("队列为空")returnindex = self.frontelements = []while True:elements.append(str(self.queue[<

相关文章:

  • Django 常用注解
  • slam入门学习笔记
  • 某系统超级管理员密码重置通用型
  • ECMAScript与JavaScript的区别:深入解析
  • Virtio半虚拟化基本原理简介
  • 有关在.Net Core中以TEXT类型将Json格式字段存到数据库的学习
  • 孩子英语不好,能学编程吗?
  • 如何选择适合的编程工具提高工作效率
  • mysql学习教程,从入门到精通,SQL UNION 运算符(27)
  • 构建高可用和高防御力的云服务架构第二部分:SLB负载均衡(2/5)
  • muduo网络库介绍
  • 机器学习-模型集成
  • 信息安全工程师(25)网络安全体系框架主要组成和建设内容
  • WebAPI编程(第三天,第四天)
  • 【Linux】驱动的基本架构和编译
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6 ...操作符
  • ESLint简单操作
  • Java 网络编程(2):UDP 的使用
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • LeetCode29.两数相除 JavaScript
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Object.assign方法不能实现深复制
  • opencv python Meanshift 和 Camshift
  • Otto开发初探——微服务依赖管理新利器
  • python学习笔记 - ThreadLocal
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue-cli3搭建项目
  • 阿里研究院入选中国企业智库系统影响力榜
  • 工作手记之html2canvas使用概述
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • ------- 计算机网络基础
  • 技术:超级实用的电脑小技巧
  • 技术胖1-4季视频复习— (看视频笔记)
  • 解析带emoji和链接的聊天系统消息
  • 设计模式(12)迭代器模式(讲解+应用)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 找一份好的前端工作,起点很重要
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​马来语翻译中文去哪比较好?
  • #include到底该写在哪
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $forceUpdate()函数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (办公)springboot配置aop处理请求.
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (原)本想说脏话,奈何已放下
  • (转)EXC_BREAKPOINT僵尸错误
  • .Net Core 中间件与过滤器
  • .NET Project Open Day(2011.11.13)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件