以陣列製作
以陣列製作環狀佇列
(CIRCULAR QUEUE)
假設放入佇列的資料為整數,且佇列最大容量是100,
則陣列可以宣告如下:
#define N 100 /* 佇列大小 */
int queue [N]; /* 陣列queue當作佇列 */
0 1 2 3 N - 1
於環狀佇列中
加入資料
當尾端為 N-1 時,而位置0 處空著時, 將資料加入 queue[0] 處。 1 2 3 0 N - 1 前端 0 1 2 3 N-2 …… N-1 前端 …… d d 尾端 尾端於環狀佇列中
刪除資料
0 1 2 3 ………… N -1 3 0 1 N -rear 前端 4 前端 尾端 4 1 2 0 1 2 3 …… N -1 3 0 1 N -rear 前端 前端 尾端 4 1 2 ……陣列製作佇列要點
佇列視為一個環,即環狀佇列。
需紀錄
前端的前一個位置
,例如使用
front
表示。
需紀錄
尾端的位置
,例如使用
rear
表示。
當
僅剩最後一個空間時
,
視為環狀佇列已滿
,不
能再加入資料。
環狀佇列何時已
滿
?
d 0 1 2 3 …… N-1 …… 1 2 3 0 2 N -1 N -rear front rear front 0 1 2 3 …… N-1 …… 1 2 3 0 2 N -1 N -rear front rearfront 加入 d d環狀佇列何時已
空
?
0 1 2 3 …… 1 N -…… 3 0 1 N -rear front 4 front rear 4 1 2 0 1 2 3 …… N - 1 …… 3 0 1 N -rear front 4 front rear 4 1 2 刪除陣列製作環狀佇列的問題
環狀佇列滿時
(front == rear) 成立
不能再加入資料
環狀佇列空時
(front == rear) 成立
不能刪除資料
當(front == rear) 成立時,佇列是滿的還是空的?
下列為兩種環狀佇列視為已滿的情形。 此時 (rear+1)%N == front 成立 1 2 3 0 N- 1 rear front 1 2 3 0 N- 1 rear front
陣列製作環狀佇列
環狀佇列已滿
( (rear+1) % N == front
) 成立
環狀佇列已空
使用陣列製作環狀佇列
#define N 100 int queue[N];
int front = N-1, rear = N-1;
1 2 3 0 2 N -1 N -rear front 0 1 2 3 N - 2 …… N - 1 rear front ……
加入資料(ADD TO A CIRCULAR QUEUE)
void add(int d) {
if ( front == (rear+1)%N ){
printf(“circular queue is full.\n”); exit(1); } rear = (rear+1)%N; queue[rear] = d; } 檢查環狀佇列是否滿了 否則rear向後移一格, 新資料加入rear位置內。
刪除資料
(DELETE FROM A CIRCULAR QUEUE)
int delete ( ) {
if ( front == rear ) {
printf (“Circular queue is empty.\n”); exit(1); } front = (front+1)%N; return queue[front]; } front變數表示真正前端元素的前一個位置 檢查環狀佇列是否空了 front向後移一格, 取出front位置之資料