1. 程式人生 > >資料結構——2.3佇列及其實現

資料結構——2.3佇列及其實現

一、什麼是佇列

佇列:具有一定操作約束的線性表 插入和刪除操作:只能在一端插入,而在另一端刪除,發生在佇列的兩頭

  • 資料插入:入佇列
  • 資料刪除:出佇列
  • 先來先服務
  • 先進先出:FIFO

二、佇列的抽象資料型別描述

型別名稱:佇列 資料物件集:一個有0個或多個元素的有窮線性表 操作集:長度為MaxSize的佇列Q∈Queue,佇列元素item∈ElementType 在這裡插入圖片描述

三、佇列的順序儲存實現

佇列的順序儲存結構通常由一個一維陣列和一個記錄佇列頭元素位置的變數front以及一個記錄佇列尾元素位置的變數rear組成 在這裡插入圖片描述

舉個例子:

  • 一開始front和rear都是-1,佇列為空 在這裡插入圖片描述

  • 加入一個工作,rear指向下標為0的地方

    在這裡插入圖片描述 在這裡插入圖片描述

  • 下面刪除一個任務,front指向這個佇列裡第一個元素的再前面一個 在這裡插入圖片描述

  • 那麼,加滿以後,再想加入元素已經加入不進去了,但佇列的前面還是空的,怎麼辦呢? 在這裡插入圖片描述

四、迴圈佇列

在這裡插入圖片描述

  • 加入元素 在這裡插入圖片描述
  • 加到這個時候,如果rear再加1,就和front相等了。代表隊列是空的還是滿的呢? 在這裡插入圖片描述 問題:為什麼會出現這種空佇列、滿佇列無法區分呢? front與rear的差距有n種情況:0,1,2,3,4,5…,n 佇列裝載元素個數情況有n+1種:0(空佇列),1(一個元素),2,3,4,5,6…,n+1 解決方案:
  • 使用額外標記:Size或者tag域。size用來記錄當前佇列的元素個數,看size是否等於0。用一個標記tag,當插入一個元素的時候,tag設為1,刪除一個元素的時候tag設為0
  • 僅使用n-1個數組空間

五、佇列順序儲存方式相應操作

  1. 入佇列 在這裡插入圖片描述
  2. 出佇列 在這裡插入圖片描述

六、佇列鏈式儲存方式及其相應操作

佇列的鏈式儲存結構也可以用一個單鏈表實現。插入和刪除操作分別在連結串列的兩頭進行;佇列指標front和rear應該分別指向連結串列的哪一頭呢?

  • front是要做刪除操作,rear是要做插入操作
  • 所以單鏈表的頭是front,尾部是rear 在這裡插入圖片描述

在這裡插入圖片描述

** 不帶頭結點的鏈式隊列出隊操作的一個例項** 在這裡插入圖片描述