00.佇列的定義佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
與棧相反,佇列是一種先進先出(first in first out,fifo)的線性表。
我們的輸入緩衝區接收鍵盤的輸入就是按照佇列的形式輸入和輸出的,不然的話就很容易出問題。
01.佇列的鏈式儲存結構佇列既可以用鍊錶來實現,也可以用順序表來實現,跟棧相反的是,棧一般我們用順序表來實現,而佇列我們常用鍊錶來實現,簡稱鏈佇列。
typedef struct qnode qnode, *queueprt;typedef struct linkqueue;
我們將隊頭指標指向鏈佇列的頭結點,而隊尾指標指向終端結點。(注:頭結點不是必須的,但是為了方便操作,我們加上了)
建立乙個佇列
建立乙個佇列要完成兩個任務:一是在記憶體中建立乙個頭結點,二是將佇列的頭指標和尾指標都指向這個生成的頭結點,此時生成乙個空佇列。
initqueue(linkqueue *q)
入佇列操作入佇列操作過程如下:
出佇列操作
出佇列操作就是將佇列中的第乙個元素移動,隊頭指標不發生變化,改變頭結點的next指標即可。
出佇列的操作過程如下:
}銷毀乙個佇列由於鏈佇列建立在記憶體的動態區,因此當乙個佇列不再有用時應當把它銷毀掉,以免過多地占用記憶體空間。
destroyqueue(linkqueue *q)
}
02.佇列的順序儲存結構佇列更適合用鏈式儲存結構來實現。假設乙個佇列有n個元素,則順序儲存結構的佇列需要建立乙個大於n的儲存單元,並把佇列的所有元素儲存在陣列的前n個單元,陣列下標為0的一端則是隊頭。
入佇列的操作其實就是在隊尾追加乙個元素,不需要移動任何元素,時間複雜度為o(1);出佇列則不同,因為我們已經假設下標為0的位置是佇列的對頭,因此每次出佇列操作所有的元素都要向前移動。這樣一來出佇列的時間複雜度為o(n),效率大打折扣。
在現實中也是如此,一群人在排隊買火車票,前邊的人買好了離開,後面的人就要全部向前一步補上空位。
可是我們研究資料結構與演算法的乙個根本目的就是要想方設法提高我們的程式的效率,按照下標為0的一端為隊頭,且隊頭不變,出佇列的時間複雜度是o(n),效率大打折扣!
如果不去限制隊頭一定要在下標為0的位置,那麼出佇列的操作就不需要移動全體元素。
上面的動畫中三個元素出隊之後,當我們要插入乙個元素時,我們已知佇列最多可以放6個元素,現在佇列中只有三個,這樣程式試圖將新的元素入隊就會出現假溢位的錯誤。
為了解決假溢位的問題,當陣列後面滿了,就再從頭開始,也就是頭尾相接的迴圈。迴圈佇列的容量固定,並且它的隊頭和隊尾指標都可以隨著元素出入佇列而發生改變,這樣迴圈佇列邏輯上就好像是乙個環形儲存空間。
但在實際的記憶體中,不可能有真正的環形儲存區,我們只能用順序表來模擬出來邏輯上的迴圈。
定義乙個迴圈佇列
#define maxsize 100typedef struct
初始化乙個迴圈佇列
initqueue(cyclequeue *q)
入佇列操作
insertqueue(cyclequeue *q, elemtype e)
出佇列操作
deletequeue(cyclequeue *q, elemtype *e)
*e = q->base[q->front];
q->front = (q->front + 1) % maxsize;
03.人生如棧
人生,就像是棧的入棧與出棧推薦閱讀leetcode上稀缺的四道shell程式設計題解析你看到自己周圍的乙個乙個人出棧,離你而去,你依舊需要堅強地走下去,不為什麼,就是讓出棧的人有乙個慰藉與安心。(楊絳 《我們仨》)
人生,彷彿是棧的重現。
每天你奔波於事業與家庭之間,做著似乎總是重複的事情,為的只是一餐溫飽,卻總不能那麼圓滿。
你總說,在哪兒跌倒了就在哪兒爬起來,但是,你發現似乎總是在同乙個地方跌倒無數次,你可曾想繞過跌倒的地方?
有那麼一次,你出棧後找不到返回位址,你憂鬱了,迷茫了...... 但幸運也伴隨著你,有乙個生活的佇列等著你進入,**充滿了美好與溫馨,在你失落時,迷茫時總能找到一絲暖意。
你想知道的線性表的內容都在這裡!!!
資料結構與演算法基礎
位元組跳動實習生面試常問的一道leetcode題目解析
leetcode.26 刪除排序陣列中的重複項
環形佇列的輸出 迴圈佇列的基本操作詳細講解
實驗學時 實驗型別 設計型 一 實驗目的 1.理解並掌握佇列的邏輯結構和順序儲存結構,了解迴圈佇列的特點 2.掌握迴圈佇列中基本操作的相關演算法 3.程式設計實現相關演算法 4.學會利用迴圈佇列解決實際問題。二 實驗條件 visual c 三 實驗原理及相關知識 1.迴圈佇列儲存結構描述 defin...
佇列和環形佇列的實現
1 基本介紹 2 陣列模擬佇列 public class arrayqueuedemo catch exception e break case h trycatch exception e break case e scanner.close flag false break default br...
陣列模擬佇列 以及佇列的復用(環形佇列)
private int front 指向佇列頭的第乙個元素 privat int maxszie 設定佇列的最大長度 private int rear 指向佇列尾的最後乙個元素的後乙個位置,留出乙個位置作為約定 因為需要留出乙個位置作為約定,那麼當陣列的maxsize 4 的時候有效資料的個數就等於...