1. 程式人生 > >python隊列的實現

python隊列的實現

語言 wid %d sco col solid self python語言 ali

隊列是一種抽象數據結構,具有以下特點:

(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隊列的實現