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移動到最右邊,即使陣列中還有...