三:**
實現佇列要麼使用陣列,要麼使用鍊錶,但由於陣列對於出隊和入隊這樣的操作效率不高,所以實現佇列一般使用鍊錶。如果現在要求你使用順序表(也就是順序隊)來實現佇列,在不考慮操作的複雜性的情況下肯定是可以實現的,但是這會存在乙個致命的問題——「假溢位」。如下,經過一系列入隊出隊操作,某一刻出現越界。
一旦出現越界,這個佇列就等於「報廢」了
而解決這個問題可以用到迴圈佇列,迴圈佇列從感覺上講不是乙個直鏈,而是乙個圓環,在某一刻隊滿時,此時還要入隊的話,隊頭指標便指向第乙個元素,重複利用之前的空間
對於普通的順序隊,其判斷隊滿的條件為容量滿,對於迴圈隊來說,其判斷隊空和隊滿的條件有點不同
首先,隊空時自然rear=front
,也即下圖
而後進隊兩個元素,進隊時arr[rear]=x
,然後rear+1
如下圖
繼續入隊,入到不能再入為止,此時rear=front
,但是前面隊空時也有rear=front
。
所以為了區分隊空和隊滿,必須犧牲掉乙個元素的位置(圖中a8)這也就是為什麼在申請空間時需要多申請乙個原因。如下當元素到達a7時,即為設定的隊滿狀態。此時front=rear+1
在這樣乙個迴圈佇列中,佇列空間為8個,下標範圍[0-7],當rear=7時隊滿。如果繼續入隊,rear就不能直接+1了,否則會越界。而要使得rear從rear=7跳到rear=0,可以rear=(rear+1)%8,因為任何乙個數對8取餘,其結果都會被對映在[0-7]內。同時為了統一操作,將所有的rear=rear+1均改為rear=(rear+1)%8。
所以說隊空rear=front
;隊滿front=(rear+1)%maxsize
;移動指標rear=(rear+1)%maxsize
和front=(front+1)%maxsize
;
;//初始化
void
circularqueuepush
(circularqueue* pq, datatype x)
;//入隊
void
circularqueuepop
(circularqueue* pq)
;//刪除
datatype circularqueuehead
(circularqueue* pq)
;//隊頭
datatype circularqueuetail
(circularqueue* pq)
;//隊頭
circularqueue.c
#include
"circularqueue.h"
void
circularqueueinit
(circularqueue* pq)
void
print
(circularqueue* pq)
}void
circularqueuepush
(circularqueue* pq, datatype x)
void
circularqueuepop
(circularqueue* pq)
datatype circularqueuehead
(circularqueue* pq)
datatype circularqueuetail
(circularqueue* pq)
}
test.c
#include
"circularqueue.h"
void
test()
intmain()
資料結構之線性結構 線性表,堆疊,佇列
對於線性表的操作 1 建立線性表 2 確定線性表的長度 3 確定線性表是否為空 4 訪問表中指定位置的節點的值 5 查詢指定值在表中的位置 6 在表中指定位置插入乙個新節點 7 刪除表中指定位置的節點 2.線性表的鏈結儲存結構 用鏈結方式儲存的線性表稱為鍊錶。優點 不必調整節點的位址,儲存單元對儲存...
資料結構 線性表 佇列
一 佇列簡介 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。include include typede...
mysql 線性表 資料結構之線性表
概要 參考 大話資料結構 把常用的基本資料結構梳理一下。線性表定義 線性表 list 零個或多個資料元素的有限序列。若將線性表記為 a 1,cdots,a a i,a cdots,a n 則表中 a 領先於 a i a i 領先於 a 稱 a 是 a i 的直接前驅元素,a 是 a i 的直接後繼元...