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 sys MAX=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+=1
queue[rear]=val
elif choice=='d':
if rear>front:
front+=1
print('[取出数值为]: [%d]' %(queue[front]))
queue[front]=0
else:
print('[队列已经空了]')
sys.exit(0)
else:
print() print('------------------------------------------')
print('[输出队列中的所有元素]:') if rear==MAX-1:
print('[队列已满]')
elif front>=rear:
print('没有')
print('[队列已空]')
else:
while rear>front:
front+=1
print('[%d] ' %queue[front],end='')
print()
print('------------------------------------------')
print()
执行结果如下
2用链表实现队列
我们以学生姓名和成绩的结构数据建立队列的节点,加上front和rear指针,这个类的声明如下:
class student:
def __init__(self):
self.name=' '*20
self.score=0
self.next=None front=student()
rear=student()
front=None
rear=None
在队列中加入新节点等于加入到队列的末端,而删除节点就是将此队列的最前端的节点删除。添加和删除操作如下:
def enqueue(name, score): # 把数据加入队列
global front
global rear
new_data=student() # 分配内存给新元素
new_data.name=name # 给新元素赋值
new_data.score = score
if rear==None: # 如果rear为None,表示这是第一个元素
front = new_data
else:
rear.next = new_data # 将新元素连接到队列末尾 rear = new_data # 将rear指向新元素,这是新的队列末尾
new_data.next = None # 新元素之后无其他元素 def dequeue(): # 取出队列中的数据
global front
global rear
if front == None:
print('队列已空!')
else:
print('姓名:%s\t成绩:%d ....取出' %(front.name, front.score))
front = front.next # 将队列前端移到下一个元素
我们使用链表来设计一个队列的程序
class student:
def __init__(self):
self.name=' '*20
self.score=0
self.next=None front=student()
rear=student()
front=None
rear=None def enqueue(name, score): # 把数据加入队列
global front
global rear
new_data=student() # 分配内存给新元素
new_data.name=name # 给新元素赋值
new_data.score = score
if rear==None: # 如果rear为None,表示这是第一个元素
front = new_data
else:
rear.next = new_data # 将新元素连接到队列末尾 rear = new_data # 将rear指向新元素,这是新的队列末尾
new_data.next = None # 新元素之后无其他元素 def dequeue(): # 取出队列中的数据
global front
global rear
if front == None:
print('队列已空!')
else:
print('姓名:%s\t成绩:%d ....取出' %(front.name, front.score))
front = front.next # 将队列前端移到下一个元素 def show(): # 显示队列中的数据
global front
global rear
ptr = front
if ptr == None:
print('队列已空!')
else:
while ptr !=None: # 从front到rear遍历队列
print('姓名:%s\t成绩:%d' %(ptr.name, ptr.score))
ptr = ptr.next select=0
while True:
select=int(input('(1)加入 (2)取出 (3)显示 (4)离开 => '))
if select==4:
break
if select==1:
name=input('姓名: ')
score=int(input('成绩: '))
enqueue(name, score)
elif select==2:
dequeue()
else:
show()
执行如下:
python队列的实现的更多相关文章
- Python队列服务 Python RQ Functions from the __main__ module cannot be processed by workers.
在使用Python队列服务 Python RQ 时候的报错: Functions from the __main__ module cannot be processed by workers. 原因 ...
- Python队列及在微信机器人中的应用
本文来源于i春秋学院,未经允许严禁转载. 最近打算更新微信机器人,发现机器人的作者将代码改进了很多,但去掉了sqlite数据库,需要自己根据需求设计数据库,跟作者沟通得到的建议是为了防止消息并发导致数 ...
- python队列Queue
Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...
- Python 队列
import multiprocessing import time if __name__ == '__main__': # 创建消息队列 # 3: 表示消息队列最大个数 queue = multi ...
- python队列基本使用
Python queue队列 作用: 解耦:使程序直接实现松耦合,修改一个函数,不会有串联关系. 提高处理效率:FIFO = 现进先出,LIFO = 后入先出. 队列: 队列可以并发的派多个线程, ...
- python队列、线程、进程、协程
目录: 一.queue 二.线程 基本使用 线程锁 自定义线程池 生产者消费者模型(队列) 三.进程 基本使用 进程锁 进程数据共享 默认数据不共享 queues array Manager.dict ...
- python队列、线程、进程、协程(转)
原文地址: http://www.cnblogs.com/wangqiaomei/p/5682669.html 一.queue 二.线程 #基本使用 #线程锁 #自定义线程池 #生产者消费者模型(队列 ...
- python socket非阻塞及python队列Queue
一. python非阻塞编程的settimeout与setblocking+select 原文:www.th7.cn/Program/Python/201406/214922.shtml 侧面认证Py ...
- Python|队列Queue
一 前言 本文算是一次队列的学习笔记,Queue 模块实现了三种类型的队列,它们的区别仅仅是队列中元素被取回的顺序.在 FIFO 队列中,先添加的任务先取回.在 LIFO 队列中,最近被添加的元素先取 ...
随机推荐
- openstack-wsgi的route中添加api流程具体解释(os-networks)添加
感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免.欢迎指正! 如有转载,请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...
- Python常用数据处理函数
1.基本统计特征函数 方法名 函数功能 所属库 使用格式 sum() 计算数据样本综合(按列计算) Pandas D.sum() mean() 计算数据样本算数平均数 Pandas D.mean() ...
- Paypal支付(一)MPL真正的快捷支付
一.前导 前面讲到了MEC支付,是在Web端集成好的,在手机端仅仅需通过WebView进行载入就可以,不须要不论什么Paypal第三方架包.以下将的是MPL支付.须要架包. 这样的支付的形式能够參考以 ...
- ORA-00907: 缺失右括号(通用解决办法)
PL/SQL 的SQL语句可以执行,但是放在hibernate中,后台打印,出现了错误. 错误的SQL解析:黄色为错误部分 Hibernate: select examine ...
- ios27--kvo
// // ViewController.h // 14-KVO的使用 #import <UIKit/UIKit.h> @interface ViewController : UIView ...
- CANopen——总线基本知识
1. 总线标准 2. 获取索引和子索引 2fh,2bh,23h,40h等,是不是对应cs的不同值: 主站1280h的对象字典?1280h-sub2,得到client的COB-ID值: 根据收到的m-& ...
- 利用Theme自定义Activity进入退出动画
有没有觉得Activity的默认动画太快了或者太难看了.. 我原来使用Activity.overridePendingTransition来自定义Activity的进入动画,却发现没法定义退出的动画. ...
- 使用Google Closure Compiler全力压缩代码(转)
JavaScript压缩代码的重要性不言而喻,如今的压缩工具也有不少,例如YUI Compressor,Google Closure Compiler,以及现在比较红火的UglifyJS.Uglify ...
- 使用 typescript 和 canvas 重构snow效果
前言:之前做过一个 snow 效果,但是是直接用 HTML 做的点击此处查看 ,几个星期前,我用 typescript 和 canvas 重构了一下, snow效果是一个很简单的效果,但是用来练手还是 ...
- typescript进阶篇之高级类型与条件类型(Readonly, Partial, Pick, Record)
本文所有东西尽可在 typescript 官网文档寻找,但是深浅不一 高级类型 lib 库中的五个高级类型 以下所有例子皆以 person 为例 interface Person { name: st ...