数据结构之队列(python)

华子目录

  • 1.队列存储结构
    • 1.1队列基本介绍
    • 1.2队列的实现方式
  • 2.顺序队列
    • 2.1顺序队列的介绍
    • 2.2顺序队列的简单实现
    • 2.3代码实现
  • 3.链式队列和基本操作
    • 3.1链式队列数据入队
    • 3.2链式队列数据出队
    • 3.3队列的链式表示和实现

1.队列存储结构

1.1队列基本介绍

  • 队列两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示:

在这里插入图片描述

  • 进数据一端为 “队尾”,出数据一端为 “队头”,数据元素进队列的过程称为 “入队”,出队列的过程称为 “出队”。
  • 队列中数据的进出要遵循 “先进先出” 的原则,即最先进队列数据元素,同样要最先出队列
  • 图1中的队列来说,从数据队列中的存储状态可以分析出元素1 最先进队,其次元素2最后元素3。此时如果将元素3出队,根据队列 “先进先出” 的特点,元素1先出队列元素2 再出队列,最后才轮到元素3 出队列。
  • 因此,数据从一端进,从另一端出,且遵循 “先进先出” 原则的线性存储结构就是队列
  • 实际生活中,队列应用随处可见,比如排队买XXX医院的挂号系统等,采用的都是队列结构

1.2队列的实现方式

队列存储结构的实现有以下两种方式:

  • 顺序队列:在顺序表的基础上实现的队列结构
  • 链队列:在链表的基础上实现的队列结构

2.顺序队列

2.1顺序队列的介绍

顺序队列,即采用顺序表模拟实现的队列结构

  • 我们知道,队列具有以下两个特点:
    • 数据从队列的一端进,另一端出
    • 数据的入队出队遵循"先进先出"的原则

因此,只要使用顺序表按以上两个要求操作数据,即可实现顺序队列。首先来学习一种最简单实现方法

2.2顺序队列的简单实现

  • 由于顺序队列底层使用的是数组,因此需预先申请一块足够大内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进队头出先进先出的要求,我们还需要定义两个指针toprear)分别用于指向顺序队列中的队头元素队尾元素,如图 1 所示:

在这里插入图片描述

  • 由于顺序队列初始状态没有存储任何元素,因此 top指针rear指针重合,且由于顺序队列底层实现靠的是数组,因此 toprear 实际上是两个变量,它的分别是队头元素队尾元素所在数组位置下标
  • 图1 的基础上,当有数据元素队列时,对应的实现操作是将其存储在指针rear 指向的数组位置,然后 rear+1;当需要队头元素出队时,仅需做 top+1 操作。

例如,在图1 基础上将 {1,2,3,4}顺序队列存储的实现操作如图2 所示:

在这里插入图片描述
图2 基础上,顺序队列中数据出队列实现过程图3所示:
在这里插入图片描述

2.3代码实现

实现基本功能:

  • 初始化队列
  • 判断队列是否为
  • 返回队头元素
  • 返回队列长度
  • 入队 : 添加元素队尾
  • 出队 : 删除队头元素
  • 遍历队列
  • 清空队列
# 本次顺序队列定义及相关函数较多使用python自身所带的列表和函数
class Queue:#队列初始化def __init__(self):self.items = []#判断队列是否为空def is_empty(self):return self.items == []#元素入队def enter_queue(self, item):self.items.insert(0, item)#队首元素出队def go_queue(self):return self.items.pop()#返回队列长度def size(self):return len(self.items)#清空队列def clear(self):self.items.clear()#获取队首元素def getTop(self):return self.items[self.size()-1]#遍历队列def display(self):return self.itemsif __name__ == '__main__':q = Queue()print("---------------------")print("初始化后的队列:", q)print("---------------------")print("当前队列是否为空:", q.is_empty())print("---------------------")print("入队前队内元素为:", q.display())q.enter_queue(5)q.enter_queue(10)q.enter_queue(11)print("入队后队内元素为:", q.display())print("---------------------")print("当前队首元素为:", q.getTop())print("---------------------")print("出队前队内元素为:", q.display())q.go_queue()print("出队后队内元素为:", q.display())print("---------------------")print("当前队列长度为:", q.size())print("---------------------")print("清空前队内元素为:", q.display())q.clear()print("清空后队内元素为:", q.display())
---------------------
初始化后的队列: <__main__.Queue object at 0x0000017D90EB8460>
---------------------
当前队列是否为空: True
---------------------
入队前队内元素为: []
入队后队内元素为: [11, 10, 5]
---------------------
当前队首元素为: 5
---------------------
出队前队内元素为: [11, 10, 5]
出队后队内元素为: [11, 10]
---------------------
当前队列长度为: 2
---------------------
清空前队内元素为: [11, 10]
清空后队内元素为: []

3.链式队列和基本操作

  • 使用链表实现的队列存储结构
  • 需要创建两个指针(命名为 toprear)分别指向链表中队列的队头元素队尾元素,如图 1 所示:

在这里插入图片描述

  • 图1 所示为链式队列初始状态,此时队列中没有存储任何数据元素,因此 toprear 指针都同时指向头节点
  • 在创建链式队列时,强烈建议初学者创建一个带有头节点链表,这样实现链式队列更简单

3.1链式队列数据入队

链队队列中,当有新的数据元素入队,只需进行以下 3步操作:

  • 该数据元素用节点包裹,例如新节点名称为 elem
  • rear指针指向的节点建立逻辑关系,即执行 rear->next=elem
  • 最后移动 rear指针指向该新节点,即 rear=elem

由此,新节点就入队成功了。

例如,在图1 的基础上,我们依次将 {1,2,3} 依次入队各个数据元素入队的过程如图2 所示:
在这里插入图片描述

3.2链式队列数据出队

链式队列中,有数据元素需要出队时,按照 “先进先出” 的原则,只需将存储该数据的节点以及它之前入队的元素节点按照原则依次出队即可。这里,我们先学习如何将队头元素出队

链式队列队头元素出队,需要做以下 3 步操作:

  • 通过 top 指针直接找到队头节点,创建一个新指针p 指向此即将出队的节点
  • p 节点(即要出队队头节点)从链表中摘除
  • 释放节点p回收其所占的内存空间

例如,在图 2)的基础上,我们将元素 12 出队,则操作过程如图 3 所示:

在这里插入图片描述

3.3队列的链式表示和实现

实现基本功能

  • 初始化队列
  • 判断队列是否为
  • 返回队头元素
  • 返回队列的长度
  • 入队: 添加元素到队尾
  • 出队: 删除队头元素
  • 遍历队列
  • 清空队列
'''
1. 队列特点:先进先出,队尾入队操作,队头出队操作
2. 使用单链表实现:尾部添加节点(入队),头部删除节点(出队)操作
3. 这是一个带有头节点的队列,front指针始终指向头节点
'''#定义链式队列节点
class Node:def __init__(self, value):self.data = valueself.next = None# 定义队列函数
class Queue:#队列初始化def __init__(self):self.front = Node(None)self.rear = self.front#判断队列是否为空def is_empty(self):return self.rear == self.front# 元素入队def enQueue(self, element):n = Node(element)self.rear.next = nself.rear = n# 队列元素出队def deQueue(self):if self.is_empty():print("队列为空")returntemp = self.front.nextself.front.next = self.front.next.nextif self.rear == temp:self.rear = self.frontdel temp# 获取队首元素def gettop(self):if self.is_empty():print("队列为空")returnreturn self.front.next.data# 遍历队列def display(self):if self.is_empty():print("队列为空")returncur = self.front.nextwhile cur != None:print(cur.data, end=" ")cur = cur.nextprint()# 清空队列def clear(self):while self.front.next != None:temp = self.front.nextself.front.next = temp.nextself.rear = self.front# 返回队列长度def size(self):cur = self.front.nextcount = 0while cur != None:count += 1cur = cur.nextreturn countqueue = Queue()
print("-----------------------------")
print("初始化的链式队列:", queue)
print("-----------------------------")
print("当前队列是否为空:", queue.is_empty())
print("-----------------------------")
print("入队前队列元素为:", end="")
queue.display()
queue.enQueue(1)
queue.enQueue(47)
queue.enQueue("tr")
print("入队后队列元素为:", end="")
queue.display()
print("-----------------------------")
print("当前队列长度为:", queue.size())
print("-----------------------------")
print("当前队列头部元素为:", queue.gettop())
print("-----------------------------")
print("出队前队列元素为:", end="")
queue.display()
queue.deQueue()
print("出队后队列元素为:", end="")
queue.display()
print("-----------------------------")
print("当前队列是否为空:", queue.is_empty())
print("-----------------------------")
print("清空后队列元素为:", end="")
queue.display()
queue.clear()
print("出队后队列元素为:", end="")
queue.display()
print("-----------------------------")
-----------------------------
初始化的链式队列: <__main__.Queue object at 0x000001BA943A9A00>
-----------------------------
当前队列是否为空: True
-----------------------------
入队前队列元素为:队列为空
入队后队列元素为:1 47 tr 
-----------------------------
当前队列长度为: 3
-----------------------------
当前队列头部元素为: 1
-----------------------------
出队前队列元素为:1 47 tr 
出队后队列元素为:47 tr 
-----------------------------
当前队列是否为空: False
-----------------------------
清空后队列元素为:47 tr 
出队后队列元素为:队列为空
-----------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452143.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg 4.3 音视频-多路H265监控录放C++开发三 :安装QT5.14.2, 并将QT集成 到 VS2019中。

一&#xff0c;安装QT&#xff0c; 重点&#xff1a;在安装QT的时候要安装msvc201x版本的组件&#xff0c; 二 &#xff0c; 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三&#xff0c;需要安装过 windows10 SDK&#xff0c;一般我们在安装vs2019的时候就…

餐饮店怎么标注地图位置信息?

随着市场竞争的日益激烈&#xff0c;商家若想在竞争中脱颖而出&#xff0c;就必须想方设法去提高自身的曝光度和知名度&#xff0c;为店铺带来更多的客流量。其中&#xff0c;地图标注便是一种简单却极为有效的方法。通过在地图平台上添加店铺位置信息&#xff0c;不仅可以方便…

电子级异丙醇溶液除硼树脂

电子级异丙醇溶液的净化除杂是一个精细的过程&#xff0c;旨在去除溶液中的杂质&#xff0c;以满足电子行业对高纯度化学品的严格要求。以下是电子级异丙醇溶液净化除杂的相关信息&#xff1a; 净化除杂方法 ● 精馏工序&#xff1a;通过精馏塔进行初步分离&#xff0c;去除大部…

(44)MATLAB读取语音信号进行频谱分析

文章目录 前言一、MATLAB代码二、仿真结果画图三、频谱分析 前言 语音信号是我们最常见的一种信号&#xff0c;本文使用MATLAB读取一段语音信号画出其波形&#xff0c;然后使用FFT变换给出其频谱&#xff0c;对其频谱进行分析。 一、MATLAB代码 读取语音数据并得出频谱的代码…

JMeter如何设置HTTP代理服务器?

1、 2、添加线程组 3、设置HTTP代理服务器&#xff0c;目标控制器选择“测试计划>线程组” 过滤掉不需要的信息 4、设置电脑手动代理 5、点击启动&#xff0c;在浏览器操作就可以了

Halcon实战——基于NCC模板匹配的芯片检测(附源码)

Halcon实战——基于NCC模板匹配的芯片检测&#xff08;附源码&#xff09; 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&am…

OpenCV高级图形用户界面(10)创建一个新的窗口函数namedWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个窗口。 函数 namedWindow 创建一个可以作为图像和跟踪条占位符的窗口。创建的窗口通过它们的名字来引用。 如果已经存在同名的窗口&am…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…

第8篇:网络安全基础

目录 引言 8.1 网络安全的基本概念 8.2 网络威胁与攻击类型 8.3 密码学的基本思想与加密算法 8.4 消息认证与数字签名 8.5 网络安全技术与协议 8.6 总结 第8篇&#xff1a;网络安全基础 引言 在现代信息社会中&#xff0c;计算机网络无处不在&#xff0c;从互联网到局…

C语言_指针_进阶

引言&#xff1a;在前面的c语言_指针初阶上&#xff0c;我们了解了简单的指针类型以及使用&#xff0c;下面我们将进入更深层次的指针学习&#xff0c;对指针的理解会有一个极大的提升。从此以后&#xff0c;指针将不再是难点&#xff0c;而是学习底层语言的一把利器。 本章重点…

Mysql(2)—SQL语法详解(通俗易懂)

一、关于SQL 1.1 简介 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发&#xff0c;旨在处理关系数据模型…

API的力量:解决编程技术问题的利器

在软件开发的世界里&#xff0c;编程技术问题无处不在。从数据获取到用户认证&#xff0c;从支付处理到地图服务&#xff0c;这些问题的解决方案往往需要深厚的专业知识和大量的开发时间。然而&#xff0c;应用程序编程接口&#xff08;API&#xff09;的出现&#xff0c;为开发…

长序列时间序列预测模型:Informer与TimesNet

Informer超越长序列时间序列预测 Informer是一种针对长序列时间序列预测的高效Transformer模型&#xff0c;旨在解决传统Transformer在处理长序列时的局限性。该模型引入了一些关键技术&#xff0c;以提高效率和准确性。以下是对Informer模型的详细介绍&#xff1a; 1. 模型背…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…

opencv 图像翻转- python 实现

在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下&#xff1a; #-*-coding:utf-8-*- # date:2021-03 # Author: DataBall - XIAN # Function: 图像翻转import cv2 # 导入OpenCV库path test.jpgimg cv2.imread(path)# 读取图片 cv2.namedWindow(image,1) …

go压缩的使用

基础&#xff1a;使用go创建一个zip func base(path string) {// 创建 zip 文件zipFile, err : os.Create("test.zip")if err ! nil {panic(err)}defer zipFile.Close()// 创建一个新的 *Writer 对象zipWriter : zip.NewWriter(zipFile)defer zipWriter.Close()// 创…

D39【python 接口自动化学习】- python基础之函数

day39 函数的返回值 学习日期&#xff1a;20241016 学习目标&#xff1a;函数&#xfe63;-52 函数的返回值&#xff1a;如何得到函数的执行结果&#xff1f; 学习笔记&#xff1a; return语句 返回值类型 def foo():return abc var foo() print(var) #abc# 函数中return函…

pc轨迹回放制作

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;pc轨迹回放制作 主要内容&#xff1a;制作车辆轨迹操作页&#xff0c;包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景&#xff1a;车辆…

微软的 Drasi:一种轻量级的事件驱动编程方法

微软的开源数据变化处理平台有望提供一种全新的方式来构建和管理可产生持续事件流的云应用程序。 Microsoft Azure 孵化团队是微软超大规模云中比较有趣的组成部分之一。它介于传统软件开发团队和研究组织之间&#xff0c;致力于构建大规模分布式系统问题的解决方案。 这些解决…

普通java web项目集成spring-session

之前的老项目&#xff0c;希望使用spring-session管理会话&#xff0c;存储到redis。 项目环境&#xff1a;eclipse、jdk8、jetty嵌入式启动、非spring项目。 实现思路&#xff1a; 1.添加相关依赖jar。 2.配置redis连接。 3.配置启动spring。 4.配置过滤器&#xff0c;拦…