讓程式設計改變世界
change the world by program
為什麼小甲魚上節課說佇列的實現上我們更願意用鏈式儲存結構來儲存?
我們先按照應有的思路來考慮下如何構造佇列的順序儲存結構,然後發掘都遇到了什麼麻煩。
我們假設乙個佇列有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)
人生,就像是棧的演變。
在父親忙碌的入棧、出棧操作中,你,誕生了!
人生,彷彿是棧的重現。
每天你奔波於事業與家庭之間,做著似乎總是重複的事情,為的只是一餐溫飽。
你總說,在**跌倒就在**爬起來,但是,你發現似乎總是在同乙個地方跌倒無數次!
有一那麼一次,你彈棧找不到返回位址,你憂鬱了,迷茫了。。。。。。
他會告訴你,在乙個個棧的外邊,其實隱藏著乙個佇列在呼叫你的每乙個棧,只是你還年輕,沒辦法看得太清楚。
但是,你抬頭仰望星空,在孤獨中多思考,在彷徨中多回顧,就有希望,不斷進取,就能成功!
人生,又是乙個大佇列的實現,春夏秋冬年復一年,改變的是時間,不變的是你對未來執著的信念!
地球近似於圓形,但並不完美。
選錯了方向,你可能要多走一些路,
但,只要你肯堅持到底,你都可以到達終點!
**:
資料結構與演算法 棧和佇列
棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...
資料結構與演算法 棧和佇列
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,它的特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設...
資料結構 棧和佇列
棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...