隊列是一種抽象數據結構,具有以下特點:
(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()
執行如下: