zoukankan      html  css  js  c++  java
  • 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	成绩:%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	成绩:%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	成绩:%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()

    执行如下:

  • 相关阅读:
    android加固系列—2.加固前先要学会破解,调试内存值修改程序走向
    算法—12.广度优先搜索
    算法—11.深度优先搜索
    算法—10.红黑二叉查找树
    算法—二叉查找树的相关一些操作及总结
    binary_search
    no title
    be face up to early
    Linux虚拟机网络配置
    网络工程问题历史遗留
  • 原文地址:https://www.cnblogs.com/jzxs/p/10372012.html
Copyright © 2011-2022 走看看