資料機構 10 順序迴圈佇列的實現及相關操作

2021-07-10 02:10:04 字數 2670 閱讀 6862

c語言版)

嚴蔚敏吳偉民編著

清華大學出版社

順序佇列的型別定義如下:

#define  maxsize 100/*佇列的最大容量*/

typedef char qelemtype;

struct  queue

;定義乙個順序隊的變數:      queue  q;

佇列的資料區為:q.data[0]---q.data[maxsize -1]

隊頭指標:q.front    隊尾指標:q.rear

約定隊頭指標指向隊頭元素,隊尾指標指向隊尾元素後面乙個位置(這樣的設定是為了某些運算的方便,並不是唯一的方法)。 

從下圖中可以看到,隨著入隊出隊的進行,會使整個佇列整體向後移動,這樣就出現了圖(d)中的現象:隊尾指標已經移到了最後,再有元素入隊就會出現溢位,而事實上此時隊中並未真的「滿員」,這種現象為「假溢位」,這是由於「隊尾入隊頭出」這種受限制的操作所造成。

解決上面的問題乙個巧妙的方法就是:將順序佇列臆造成乙個環狀的空間,如下圖,稱之為迴圈佇列

順序迴圈佇列的定義

因為是頭尾相接的迴圈結構,入隊時的隊尾指標加1操作修改為:q.rear=(q.rear+1) % (n0+1);

出隊時的隊頭指標加1操作修改為:q.front=(q.front+1) % (n0+1);

設n0=9,圖是迴圈佇列操作示意圖。 

從圖的迴圈隊可以看出,在隊空情況下有:front==rear,在隊滿情況下也有:front==rear就是說「隊滿」和「隊空」的條件是相同的了。這顯然是必須要解決的乙個問題。

方法之一是附設乙個儲存隊中元素個數的變數如num,當num==0時隊空,當num==maxsize時為隊滿。

另一種方法是少用乙個元素空間,把圖(d)所示的情況就視為隊滿,此時的狀態是隊尾指標加1就會從後面趕上隊頭指標,這種情況下隊滿的條件是:(rear+1) % maxsize ==front,也能和空隊區別開。

下面的迴圈佇列及操作按第二種方法實現。

隊空:front==rear

隊滿: (rear+1) mod maxsize ==front

隊中元素個數n=(rear-front+maxsize )mod maxsize 

入隊:rear=(rear+1) % maxsize ;

出隊:front=(front+1) % maxsize ;

/*順序迴圈佇列:少用乙個元素空間,約定以「佇列頭指標在佇列尾指標的下一位置(環狀的下一位置)上」作為佇列「滿」狀態的標誌

即,隊滿:q.f == (r.r + 1)%maxsize

對空:q.f == q.r

隊長:(q.r - q.f + maxsize)%maxsize

入隊時尾指標後移:q.r = (q.r + 1)%maxsize

出隊時頭指標後移:q.f = (q.f + 1)%maxsize

*/#include#define maxsize 30

typedef char qelemtype;

typedef structsqqueue;

//初始化乙個空佇列

void initqueue(sqqueue &q)

//求佇列長度

int getqueuelength(sqqueue q)

//入隊操作,尾指標後移

void enqueue(sqqueue &q, qelemtype e)

q.data[q.r] = e;

q.r = (q.r + 1)%maxsize;

}

//出隊操作,頭指標後移,e返回出隊元素值

void dequeue(sqqueue &q, qelemtype &e)

e = q.data[q.f];

printf("元素%c出隊\n", e);

q.f = (q.f + 1)%maxsize;

}

//利用入隊操作建立乙個佇列,他含有n個元素

資料機構 棧和佇列

一種線性結構 相比陣列,棧對應的操作是陣列的乙個子集 只能從一段新增和取出元素 這一端稱為棧頂 棧是一種後進先出的資料結構 last in first out lifo 如圖 有元素1 2 3 4 進棧順序為 1 2 3 4,最後進棧的元素4最先出棧。undo操作 撤銷 例如寫 的時候寫錯的,利用快...

迴圈佇列(順序佇列)的實現

迴圈佇列 順序佇列 的實現 include include include include define n 6 定義資料型別 typedef int datatype t 定義結構體 typedef structsequeue t sequeue t sq 建立乙個空的佇列 sequeue t s...

演算法和資料機構學習筆記之佇列

init 初始化操作 enquene self,item 若佇列存在,插入新元素item到佇列中,並成為隊尾元素 dequene self 刪除佇列中隊頭元素,並返回隊頭元素 思路 陣列實現佇列時,要注意,隨著不斷進隊,出隊,head和tail都會持續往後移動。當tail移動到最右邊,即使陣列中還有...