資料結構之迴圈佇列和棧的應用

2021-08-03 00:08:45 字數 2663 閱讀 2205

前面提到,在佇列的順序儲存結構中,必須要討論順序佇列的陣列越界(或上溢)問題。

根據順序佇列的定義,我們可以很輕鬆的發現,當佇列刪除乙個元素之後,即front指標向後移動之時,往往這個時候就有可能出現所謂的「假溢位」現象,即可能會出現下圖所示這般:

解決「假溢位」的辦法有很多,其中最為出色的是這四種方法:

一、採用迴圈佇列

二、按最大可能的進隊操作次數設計順序佇列的最大元素個數

三、修改出隊演算法,使得每一次出佇列後都把佇列中剩餘的元素向對頭方向移動乙個位置

四、修改入隊演算法,增加判斷條件,當假溢位時,把佇列中的元素向對頭移動,然後完成入隊操作

然而,最常用的方法是:迴圈佇列

迴圈佇列是將儲存佇列的儲存區域看成乙個首位相連的圓環,即將q->data[0]q->data[max-1]連線起來,形成乙個環形表。

入隊操作時:隊尾指標加1,描述為q->rear=(q->rear+1)%max;

出隊操作時:對頭指標加1,描述為q->front=(q->front+1)%max;

然而使用迴圈佇列急需解決的乙個問題就是:

當隊空的時候:q->front=q->rear;

當隊滿的時候:q->front=q->rear;

說白了,無法區分到底什麼時候隊滿和隊空。

於是解決辦法有三種:

一、使用變數(假設為a)計數,入隊a+1,出隊a-1,隊空條件(a==0),隊滿條件(a>0&&q->rear=q->front)

二、設定乙個標誌位flag,入隊則flag=1;出隊則flag=0;若隊滿則:(q->front=q->rear&&flag==1),若隊空則(q->front=q->rear&&flag==0)

三、損失乙個空間不用,即front所指處不用,當佇列元素為max-1時即認為滿了,此時隊空(q->front=q->rear),隊滿(q->front=(q->rear+1)%max

其中第三種辦法是最為熟悉的.

q->rear>=q->front時,迴圈佇列的長度len=q->rear-q->front;

q->rear<q->front時,len=q->rear-q->front+max;

彙總:

迴圈佇列的初始化條件:q->rear=q->front=0;

迴圈佇列滿條件:(q->rear+1)%max=q->front;

迴圈佇列空條件:q->front=q->rear

迴圈佇列依舊是順序佇列,除了邏輯上不同之外,其餘的都是非常的清楚,故迴圈佇列的操作的綜合程式與順序佇列的非常相似,若有所需要,可檢視博文-順序佇列,在此不再贅述。

棧的應用

用非遞迴演算法將輸入的任意乙個十進位制整數轉換為八進位制數。

解題思路這個題目相對簡單,放在棧的應用十分合適,將十進位制除以8的餘數壓入棧中,所得商重複上述動作,直至商為0.

總結這次滿打滿算,收穫頗豐,除了知曉了佇列的奧妙,順便還體驗了一把棧的應用,從中我們可以看出,基本的思想時相對簡單的,難的就是如何將思想轉換為語言來形容,這是初級開發者的表現,爭取再進一步,成為以思想著稱的高階開發者!

資料結構之順序棧和迴圈佇列

1 順序棧 2 include 3 using namespace std 4const int stacksize 5 5 class seqstack6 18seqstack seqstack 1922 seqstack seqstack 2326 intseqstack empty 2732 ...

資料結構之棧和佇列

棧 stack 是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性表,簡稱lifo結構。棧的插入操作,叫做進棧,也稱壓棧 入棧。類似子彈入彈夾。...

資料結構之棧和佇列

棧是乙個非常常見的資料結構,它在計算機領域中被廣泛的使用,比如作業系統會給每個執行緒分配乙個棧。用來儲存函式呼叫時各個函式的引數,返回值以及臨時變數等。棧的特點是先進後出。通常棧是乙個不考慮排序的資料結構,我們需要o n 時間才能找到棧中的最大值或者最小值,如果想要在o 1 時間內找到棧中的最大值或...