python队列的实现
Posted 橘子先生123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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队列的实现的主要内容,如果未能解决你的问题,请参考以下文章