| 狀態 | 條件 | 含義 |
| 空 | head == tail | 無有效元素 |
| 滿 | (tail + 1) % CAP == head | 犧牲一單元,實際容量 CAP-1 |
完整實現
#define QUEUE_CAP 100
typedef struct {
int data[QUEUE_CAP];
int head, tail;
} CircularQueue;
void Queue_Init(CircularQueue *q) { q->head = q->tail = 0; }
bool Queue_IsEmpty(const CircularQueue *q) { return q->head == q->tail; }
bool Queue_IsFull(const CircularQueue *q) { return (q->tail + 1) % QUEUE_CAP == q->head; }
bool EnQueue(CircularQueue *q, int val) {
if (Queue_IsFull(q)) return false;
q->data[q->tail] = val;
q->tail = (q->tail + 1) % QUEUE_CAP;
return true;
}
bool DeQueue(CircularQueue *q, int *out) {
if (Queue_IsEmpty(q)) return false;
*out = q->data[q->head];
q->head = (q->head + 1) % QUEUE_CAP;
return true;
}
void Queue_Print(const CircularQueue *q) {
for (int i = q->head; i != q->tail; i = (i + 1) % QUEUE_CAP)
printf("%d ", q->data[i]);
puts("");
}
測試用例
int main(void) {
CircularQueue q; Queue_Init(&q);
EnQueue(&q, 4); EnQueue(&q, 1); EnQueue(&q, 2);
EnQueue(&q, 9); EnQueue(&q, 8);
Queue_Print(&q); // 4 1 2 9 8
int v;
DeQueue(&q, &v); DeQueue(&q, &v);
Queue_Print(&q); // 2 9 8
return 0;
}
進階:不犧牲單元的替代方案
- 計數器法:增加
size 字段,滿判斷 size == CAP,空 size == 0。
- 標志位法:增加
bool full_flag,入隊置 true,出隊置 false。
- 指針標記法:
head/tail 用結構體帶 tag 位(需原子操作)。
犧牲一單元法最簡潔,嵌入式/教學首選;高性能庫常用計數器法。
避坑提醒
tail 指向下一個寫入位置,而非最後元素,勿混淆。
- 打印/遍歷時用
i != tail 條件,而非 i < tail(跨越 0 界失效)。
- 併發場景需對
head/tail/size 加鎖或用原子操作。
- 上一篇文章: C語言靜態數組實現棧:固定容量、O(1)操作的極簡模型
- 下一篇文章: C語言單鏈表實現棧:帶頭節點設計,動態擴容、無容量上限
Copyright ©
程式碼之家 All Rights Reserved