/**
* 佇列複習**
* adt queue is
* operations
* queue createemptyqueue(void)
* 建立乙個空佇列
* int isemptyqueue(queue qu)
* 判斷佇列qu是否為空
* void enqueue(queue qu, datatype x)
* x進入隊尾
* void dequeue(queue qu)
* 頭元素出隊
* datatype frontqueue(queue qu)
* 求頭元素的值
* end adt queue
*/#include
#include
/** * 佇列定義
*/struct seqqueue
;typedef
struct seqqueue* pseqqueue;
/** * 順序佇列 建立空佇列
* @param size
* @return
*/pseqqueue createemptyqueue_seq
(int size)
printf
("元素陣列分配失敗\n");
}printf
("佇列建立失敗\n");
}/**
* 佇列 判斷是否為空
* @param paqu
* @return
*/int
isemptyqueue_seq
(pseqqueue paqu)
/** * 佇列 進隊操作,進入隊尾
* @param paqu
* @param x
*/void
enqueue_seq
(pseqqueue paqu,
int x)
paqu->qu[paqu->r]
= x;
//防止陣列越界
paqu->r =
(paqu->r +1)
%(paqu->maxnum)
;//如果最大為10,0+1=1 1%10 = 1;可以防止paqu->r指向被犧牲的最後乙個數字
}/**
* 佇列 隊首元素退出佇列
* @param paqu
*/void
dequeue_seq
(pseqqueue paqu)
//防止陣列越界
paqu->f =
(paqu->f +1)
%(paqu->maxnum);}
/** * 取得隊頭元素;
* @param paqu
* @return
*/int
frontqueue_seq
(pseqqueue paqu)
return paqu->qu[paqu->f];}
intmain()
;int test2[20]
=;pseqqueue paqu =
createemptyqueue_seq
(size)
;for
(int i=
0;i<
20;i++
)printf
("列印test1佇列:\n");
while(!
isemptyqueue_seq
(paqu)
)for
(int i=
0;i<
20;i++
)printf
("列印test2佇列:\n");
while(!
isemptyqueue_seq
(paqu)
)return0;
}
1.迴圈佇列採用了很好的辦法讓下標為 maxnum-1 元素的下個元素的下標是0。聽起來有點繞,但是利用取餘的操作,完美的實現了這一點。
若xr + 1) % maxnum == paqu->f
進隊操作移動r下標:paqu->r = (paqu->r + 1) % maxnum;
出隊:空隊判斷很簡單,主要是移動下標的操作。
paqu->f = (paqu->f + 1) % maxnum;
2.無論是否滿隊,只要清空佇列,下次開始都是paqu->r的下標。這也可以保證運用取餘判斷操作不會出錯。
資料結構與演算法 棧 定義與操作
include include 棧 複習 adt stack is operations 1.stack createemptystack void 建立空棧 2.int isemptystack void 判斷是否為空棧 3.void push stack st,datatype x 向棧st的棧...
資料結構與演算法 佇列
學習了好長 一段時間的資料結構,由於時間關係一直沒有寫部落格。這次打算將這段時間的學習內容寫下來做個整理。佇列作為線性結構的一種,其實用性不用多說。這裡總結下兩種結構的佇列實現。迴圈佇列 先列下以順序表結構形成的普通順序佇列存在的問題 隊頭不斷刪除元素,將使佇列的頭部空出單元 隨著刪除 插入的進行,...
資料結構與演算法 佇列
佇列 佇列與棧不同,它是一種先進先出的結構 實現 1 陣列 2 鍊錶 記錄的資料 1 隊首位置 第乙個元素的位置 2 隊尾位置 最後乙個元素的位置 3 佇列大小 size 佇列操作 entryqueue 入隊 exitqueue 出隊 isqueueempty 隊列為空 isqueuefull 佇列...