為什麼小甲魚上節課說佇列的實現上我們更願意用鏈式儲存結構來儲存?
我們先按照應有的思路來考慮下如何構造佇列的順序儲存結構,然後發掘都遇到了什麼麻煩。
我們假設乙個佇列有n個元素,則順序儲存的佇列需建立乙個大於n的儲存單元,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端則是隊頭。
no pic you say a j8
佇列的順序儲存結構
入佇列操作其實就是在隊尾追加乙個元素,不需要任何移動,時間複雜度為o(1)。
出佇列則不同,因為我們已經架設下標為0的位置是佇列的隊頭,因此每次出佇列操作所有元素都要向前移動。
佇列的順序儲存結構
在現實中也是如此,一群人在排隊買火車票,前邊的人買好了離開,後面的人就要全部向前一步補上空位。
可是我們研究資料結構和演算法的乙個根本目的就是要想方設法提高我們的程式的效率,按剛才的方式,出佇列的時間複雜度是o(n),效率大打折扣!
如果我們不去限制隊頭一定要在下標為0的位置,那麼出佇列的操作就不需要移動全體元素。
佇列的順序儲存結構
但是這樣也會出現一些問題,例如按下邊的情形繼續入佇列,就會出現陣列越界的錯誤。
佇列的順序儲存結構
可事實上我們有0和1兩個下標還空著,這叫假溢位。
我們再想想,要解決假溢位的辦法就是如果後面滿了,就再從頭開始,也就是頭尾相接的迴圈。
迴圈佇列它的容量是固定的,並且它的隊頭和隊尾指標都可以隨著元素入出佇列而發生改變,這樣迴圈佇列邏輯上就好像是乙個環形儲存空間。
但要注意的是,在實際的記憶體當中,不可能有真正的環形儲存區,我們只是用順序表模擬出來的邏輯上的迴圈。
我們通過一段動畫片來加深印象吧!
迴圈佇列
於是我們發覺了,似乎迴圈佇列的實現只需要靈活改變front和rear指標即可。
也就是讓front或rear指標不斷加1,即時超出了位址範圍,也會自動從頭開始。我們可以採取取模運算處理:
(rear+1) % queuesize
(front+1) % queuesize
取模就是取餘數的意思,他取到的值永遠不會大於除數,大家結合例項拿張紙算一算就知道啦~
#define maxsize 100
typedef struct
initqueue(cyclequeue *q)
insertqueue(cyclequeue *q, elemtype e)
deletequeue(cyclequeue *q, elemtype *e)
人生,就像是棧的演變。
在父親忙碌的入棧、出棧操作中,你,誕生了!
人生,彷彿是棧的重現。
每天你奔波於事業與家庭之間,做著似乎總是重複的事情,為的只是一餐溫飽。
你總說,在**跌倒就在**爬起來,但是,你發現似乎總是在同乙個地方跌倒無數次!
有一那麼一次,你彈棧找不到返回位址,你憂鬱了,迷茫了。。。。。。
他會告訴你,在乙個個棧的外邊,其實隱藏著乙個佇列在呼叫你的每乙個棧,只是你還年輕,沒辦法看得太清楚。
但是,你抬頭仰望星空,在孤獨中多思考,在彷徨中多回顧,就有希望,不斷進取,就能成功!
人生,又是乙個大佇列的實現,春夏秋冬年復一年,改變的是時間,不變的是你對未來執著的信念!
地球近似於圓形,但並不完美。
選錯了方向,你可能要多走一些路,
但,只要你肯堅持到底,你都可以到達終點!
順序儲存結構的迴圈佇列
第一點 rear指向的是隊尾的下乙個元素 為了不讓rear此時指向的是front 會留個空 讓rear指向乙個空位 第二點 因為留了個空位 所以當你要插入k個元素的時候 你就要給這個順尋儲存結構陣列長度設為k 1 第三點 你在返回隊尾 計算長度等等進行加減運算 的時候都要記得取模 在返回rear的時...
佇列 順序儲存結構及其基本運算(迴圈佇列)
該文章主要介紹迴圈佇列的順序儲存結構以及相關運算。標頭檔案 csqqueue.h template class sqqueueclass1 迴圈佇列類模板 原始檔 csqqueue.cpp include include csqqueue.h const int maxsize 100 迴圈隊基本運...
資料結構 環形佇列 迴圈佇列 順序儲存
佇列是對頭出 隊尾入的先進先出線性表。需要兩個指標front和rear分別來指向隊頭和隊尾。front指向隊頭元素的前乙個位置,rear總是指向隊尾元素。進隊 rear 1 出隊 front 1 隊空條件 front rear 隊滿條件 rear maxsize 1 但是這樣會出現假溢位的情況,因為...