1. 程式人生 > >Stack棧類與、Queue佇列與線性表的區別和聯絡

Stack棧類與、Queue佇列與線性表的區別和聯絡

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。一個是隊頭指標front,它指向隊頭元素;另一個是隊尾指標rear,它指向下一個入隊元素的儲存位置,如圖所示

 

每次在隊尾插入一個元素是,rear增1;每次在隊頭刪除一個元素時,front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。當front=rear時,佇列中沒有任何元素,稱為空佇列。當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被佔用,這些空間是已經出隊的佇列元素曾經佔用過得儲存單元。

順序佇列中的溢位現象:

(1) "下溢"現象:當佇列為空時,做出隊運算產生的溢位現象。“下溢”是正常現象,常用作程式控制轉移的條件。

(2)"真上溢"現象:當佇列滿時,做進棧運算產生空間溢位的現象。“真上溢”是一種出錯狀態,應設法避免。

(3)"假上溢"現象:由於入隊和出隊操作中,頭尾指標只增加不減小,致使被刪元素的空間永遠無法重新利用。當佇列中實際的元素個數遠遠小於向量空間的規模時,也可能由於尾指標已超越向量空間的上界而不能做入隊操作。該現象稱為"假上溢"現象。

2).迴圈佇列

在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置

。自己真從MaxSize-1增1變到0,可用取餘運算rear%MaxSize和front%MaxSize來實現。這實際上是把佇列空間想象成一個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也就稱為迴圈佇列。除了一些簡單應用之外,真正實用的佇列是迴圈佇列

在迴圈佇列中,當佇列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多隻能有MaxSize-1個佇列元素,當迴圈佇列中只剩下一個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件時front=rear,而佇列判滿的條件時front=(rear+1)%MaxSize。隊空和隊滿的情況如圖: