1. 程式人生 > 實用技巧 >六、佇列的實現

六、佇列的實現

佇列的定義及實現

佇列的定義
  佇列是一種特殊的線性表
  佇列僅線上性表的兩端進行操作
   隊頭(Front):取出資料元素的一端
   隊尾(Rear):插入資料元素的一端
佇列的性質
  先進先出(FIFO,First In First Out)
六、佇列的實現
 佇列的一些常用操作
  建立佇列
  銷燬佇列
  清空佇列
  進佇列
  出佇列
  獲取隊頭元素
  獲取佇列的長度
佇列的順序儲存實現
六、佇列的實現
實現程式碼:附件中SeqQue資料夾
佇列的鏈式儲存實現
六、佇列的實現
實現程式碼:附件中ListQue資料夾

佇列的優化實現

 順序佇列
  線性表的第一個元素作為隊頭
  線性表的最後一個元素作為隊尾
 入隊的新元素是線上性表的最後,時間複雜度為O(1)

 出隊時需要將後續的所有元素向前移動,時間複雜度O(n)
問題:如何將出隊操作的時間複雜度降低到O(1)?
順序佇列的優化方案
 定義front使其始終代表隊頭的下標
  出隊時將隊頭元素返回,且front++
 定義rear使其始終代表隊尾下一個元素的下標
  入隊時將新元素插入,且rear++
 沒有必要只將下標為0的位置定義為隊頭
六、佇列的實現
順序佇列的關鍵狀態
 初始狀態:length == 0, front == 0, rear == 0;
 空佇列狀態:length == 0, front == rear;
 滿佇列狀態:length == capacity, front == rear;
迴圈使用佇列中的空間
 入隊:rear = (rear + 1) % capacity;
 出隊:front = (front + 1) % capacity;
實現程式碼:附件中SeqQue_2資料夾
鏈式佇列的瓶頸
 鏈式佇列
  線性表的第一個元素作為隊頭
  線性表的最後一個元素作為隊尾
 入隊的新元素是線上性表的最後,時間複雜度為O(n)
 出隊的元素即連結串列的第一個元素,時間複雜度O(1)
問題:如何將入隊操作的時間複雜度降低到O(1)?
鏈式佇列的優化方案
 定義rear指標始終指向連結串列中的最有一個元素
  入隊時將新元素通過rear插入隊尾,且將rear指向新元素
六、佇列的實現
鏈式佇列的關鍵狀態
 空佇列狀態:front == NULL, rear == NULL;
關鍵操作
 入隊:
  rear->next = node;
  rear = node;
  node->next = NULL;
 出隊:
  front = front->next;
實現程式碼:附件中ListQue_2資料夾

佇列的特別實現

棧與佇列:用棧實現佇列
六、佇列的實現
實現思路
 準備兩個棧用於實現佇列:inStack和outStack
 當有新元素入隊時:將其壓入inStack中
 當需要出隊時:
  當outStack為空時:
   1. 將inStack中的元素逐一彈出並壓入outStack中
   2. 將outStack的棧頂元素彈出
  當outStack不為空時:
   – 直接將outStack的棧頂元素彈出
演算法框架
六、佇列的實現
實現程式碼:附件中NewQue資料夾

附件

轉載於:https://blog.51cto.com/yinsuifeng/2364451