python队列的实现
队列是一种抽象数据结构,具有以下特点:
(1)具有先进先出的特性(FIFO)
(2)拥有两种基本操作,即加入和删除,而且使用front和rear两个指针来分别指向队列的前端和末尾。
队列的基本操作
create 创建空队列
add 将新数据加入队列的末尾,返回新队列
delete 删除队列前端的数据,返回新队列
front 返回队列前端的值
empty 若队列为空,则返回 ‘真’,否则返回 ‘假’
实现queue有两种方式可以用数组和链表
1.我们先用数组实现队列,数组实现队列的好处在于算法相当简单,但是也有缺点,数组无法根据队列的实际需要动态申请,
只能声明固定的大小。现在我们声明一个有限容量的数组
MAXSIZE=4 #定义队列的大小 queue=[0]*MAXSIZE front=-1 rear=-1
(1)开始时,我们将front与rear都设置-1,当front = rear时,为空队列
事件说明 | front | rear | Q(0) | Q(1) | Q(2) | Q(3) |
空队列 | -1 | -1 |
(2)当加入dataA , front=-1,rear=0,没加入一个元素,将rear值加1:
加入dataA | -1 | 0 | dataA |
(3)加入dataB,dataC,front=-1,rear=2:
加入dataB、dataC | -1 | 2 | dataA | dataB | dabaC |
(4)取出dataA,front=0,rear=2,每取出一个元素,将front的值加1:
取出dataA | 0 | 2 | dataB | dataC |
(5)加入dataD,front=0,rear=3,此时rear=MAXSIZE-1 ,表示队列已满
加入dataD | 0 | 3 | dataB | dataC | dataD |
(6)取出dataB,front =1,rear=3:
取出dataB | 1 | 3 | dataC | dataD |
对于以上队列操作,可以用Python语言实现一个队列的操作
import sysMAX=10 #定义队列的大小 queue=[0]*MAX front=rear=-1 choice='' while rear<MAX-1 and choice !='e':choice=input('[a]表示加入一个数值,[d]表示取出一个数值,[e]表示跳出此程序: ')if choice=='a':val=int(input('[请输入数值]: '))rear+=1queue[rear]=valelif choice=='d':if rear>front:front+=1print('[取出数值为]: [%d]' %(queue[front]))queue[front]=0else:print('[队列已经空了]')sys.exit(0)else:print()print('------------------------------------------') print('[输出队列中的所有元素]:')if rear==MAX-1:print('[队列已满]') elif front>=rear:print('没有')print('[队列已空]') else:while rear>front:front+=1print('[%d] ' %queue[front],end='')print()print('------------------------------------------') print()
执行结果如下
2用链表实现队列
我们以学生姓名和成绩的结构数据建立队列的节点,加上front和rear指针,这个类的声明如下:
class student:def __init__(self):self.name=' '*20self.score=0self.next=Nonefront=student() rear=student() front=None rear=None
在队列中加入新节点等于加入到队列的末端,而删除节点就是将此队列的最前端的节点删除。添加和删除操作如下:
def enqueue(name, score): # 把数据加入队列global frontglobal rearnew_data=student() # 分配内存给新元素new_data.name=name # 给新元素赋值new_data.score = scoreif rear==None: # 如果rear为None,表示这是第一个元素front = new_dataelse:rear.next = new_data # 将新元素连接到队列末尾 rear = new_data # 将rear指向新元素,这是新的队列末尾new_data.next = None # 新元素之后无其他元素def dequeue(): # 取出队列中的数据global frontglobal rearif front == None:print('队列已空!')else:print('姓名:%s\t成绩:%d ....取出' %(front.name, front.score))front = front.next # 将队列前端移到下一个元素
我们使用链表来设计一个队列的程序
class student:def __init__(self):self.name=' '*20self.score=0self.next=Nonefront=student() rear=student() front=None rear=Nonedef enqueue(name, score): # 把数据加入队列global frontglobal rearnew_data=student() # 分配内存给新元素new_data.name=name # 给新元素赋值new_data.score = scoreif rear==None: # 如果rear为None,表示这是第一个元素front = new_dataelse:rear.next = new_data # 将新元素连接到队列末尾 rear = new_data # 将rear指向新元素,这是新的队列末尾new_data.next = None # 新元素之后无其他元素def dequeue(): # 取出队列中的数据global frontglobal rearif front == None:print('队列已空!')else:print('姓名:%s\t成绩:%d ....取出' %(front.name, front.score))front = front.next # 将队列前端移到下一个元素def show(): # 显示队列中的数据global frontglobal rearptr = frontif ptr == None:print('队列已空!')else:while ptr !=None: # 从front到rear遍历队列print('姓名:%s\t成绩:%d' %(ptr.name, ptr.score))ptr = ptr.nextselect=0 while True:select=int(input('(1)加入 (2)取出 (3)显示 (4)离开 => '))if select==4:breakif select==1:name=input('姓名: ')score=int(input('成绩: '))enqueue(name, score)elif select==2:dequeue()else:show()
执行如下:
转载于:https://www.cnblogs.com/jzxs/p/10372012.html
python队列的实现相关推荐
- c++ 优先队列_什么是队列?(Python队列)
什么是队列?(Python队列) 前言 上篇文章介绍了 Python 中的多线程mp.weixin.qq.com .今天来介绍下编程中常会用到的一个数据结构 - 队列. 不知道大家是否还记得什么是数 ...
- python队列只能一个个读取吗_python队列Queue的详解
Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...
- python队列实现_Python 数据结构之队列的实现
Python 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queue: ...
- python 优先队列_示例讲解:python队列原理及实现方法与操作思路
今天为大家带来的内容是:示例讲解:python队列原理及实现方法与操作思路 本文内容主要介绍了python队列原理及实现方法,结合实例形式详细分析了Python队列的概念.原理.定义及基本操作技巧,需 ...
- Python队列Queue
Python队列Queue Queue是python标准库中的线程安全的队列(FIFO),提供了一个多线程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递. 常见方法 1.put( ...
- 《Python全栈开发:Python 队列(queue)》
一.Python 队列(queue) Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列Pr ...
- Python队列左侧元素弹出queue.popleft()
[小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python队列左侧元素弹出 queue.popleft() [太阳]选择题 以下Pytho ...
- python队列_Python队列
python队列 In our previous tutorial we have discussed about python time sleep function of the time mod ...
- python队列queue不堵塞_python 队列(queue)阻塞
背景:python 队列 queue.Queue 或 multiprcessing.Queue 或其他队列在写入队列或从队列中读取元素时,都有可能会发生线程阻塞. 下面来说一下阻塞的类型,然后怎么避免 ...
- Python 队列 queue
Python 队列 一.分类 1. Queue 标准队列,先进先出(FIFO),队尾插入,队头取元素. 2. LifoQueue 后进先出(first in last out).与栈的类似 3. Pr ...
最新文章
- CVPR 2018 | 腾讯AI Lab入选21篇论文详解
- 让Oracle SQL Developer显示的时间包含时分秒
- PHP新浪乐居面试题,一个朋友去新浪乐居面试时的面试题(PHP)
- loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
- QT5.4 vs2013静态加载插件的sqlite静态编译
- 【今日CV 视觉论文速览】Part2 1 Feb 2019
- App Transport Security has blocked a cleartext
- SpacePack 运维工具之 Auto fdisk
- html设置等宽字体效果
- android 上拉抽屉,Flutter上拉抽屉实现
- VS2019:添加现有项目 / 现有cpp文件
- Spring Boot 集成 批处理框架Spring batch
- 安卓获取string.xml文件里的值
- [APK签名] jarsigner APK V1签名
- 你公司哪个部门是“老大”?
- 超超超简单Typora修改字体颜色
- 软件工程专业电商网站毕业论文答辩实录(基于SSM+VUE前后端分离的 “依伴汉服”网)
- 关于使用华为手机进行自动化测试的一个坑
- 中国照片编辑软件市场现状研究分析与发展前景预测报告(2022)
- 暑假N天乐【比赛篇】 —— 2019牛客暑期多校训练营(第一场)
热门文章
- php实现钟表,用html5实现一个简单的钟表外观
- 三数之和java实现ArrayList-leetcode算法编程-探索字节跳动面试
- matlab画出鸢尾花数据集散点图尾花,鸢尾花数据集分以及绘制散点矩阵图
- 3D打印机将用于太空食物 未来或可打印披萨
- 数显之家快讯:【SHIO世硕心语】一个人成功之前,需要失去五样东西!
- excel熵值法计算权重_指标合成的客观权重法之熵权法
- 2-网络编程学习环境搭建
- 异常:org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage [hiber
- Mysqldump备份报错1449
- 流量卡之家:AI、无人机、物联网、自动驾驶 未来取决于5G