• 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()

    执行如下:

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/jzxs/p/10372012.html
Copyright © 2020-2023  润新知