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队列的实现的主要内容,如果未能解决你的问题,请参考以下文章

第十一节 双端队列的概念和python代码实现

perl中的队列

Python实现简单多线程任务队列

队列-Python 实现

python的栈和队列的实现代码

python的栈和队列的实现代码