循環佇列以固定大小陣列實現 FIFO,透過 `front`/`rear` 指標與模數運算重複利用空間。本文提供完整可編譯程式碼,包含初始化、判斷滿/空、入隊、出隊、遍歷。
#define Data_Type int
#define Queue_Len 5
typedef struct Queue {
Data_Type data[Queue_Len];
int front; /* 隊頭元素前一個位置 */
int rear; /* 隊尾元素位置 */
} QUEUE, *QQUEUE;
採用「浪費一格空間」判斷滿:`(rear+1)%N == front` 為滿,`front == rear` 為空。
void create(QQUEUE q) {
q->front = q->rear = 0;
}
bool isFull(QQUEUE q) {
return (q->rear + 1) % Queue_Len == q->front;
}
bool isEmpty(QQUEUE q) {
return q->front == q->rear;
}
bool add(QQUEUE q, Data_Type val) {
if (isFull(q)) return false;
q->rear = (q->rear + 1) % Queue_Len;
q->data[q->rear] = val;
return true;
}
Data_Type out(QQUEUE q) {
if (isEmpty(q)) exit(-1);
Data_Type val = q->data[(q->front + 1) % Queue_Len];
q->front = (q->front + 1) % Queue_Len;
return val;
}
void traverse(QQUEUE q) {
int i = q->front;
while (i != q->rear) {
i = (i + 1) % Queue_Len; /* 先移至下一有效元素 */
printf("%d ", q->data[i]);
}
}
int main() {
QUEUE q; create(&q);
add(&q,1); add(&q,2); add(&q,3); add(&q,4);
out(&q); /* 移除 1 */
add(&q,5); /* 佇列: 2 3 4 5 */
out(&q); /* 移除 2 */
add(&q,6); /* 佇列: 3 4 5 6 */
out(&q); /* 移除 3 */
add(&q,7); /* 佇列: 4 5 6 7 */
traverse(&q); /* 輸出: 4 5 6 7 */
return 0;
}