码迷,mamicode.com
首页 > 编程语言 > 详细

python队列的实现

时间:2019-02-13 22:26:35      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:mamicode   empty   使用   而且   exit   queue   节点   let   size   

队列是一种抽象数据结构,具有以下特点:

(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队列的实现

标签:mamicode   empty   使用   而且   exit   queue   节点   let   size   

原文地址:https://www.cnblogs.com/jzxs/p/10372012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!