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

執行如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM