循環隊列是順序隊列的經典改進,通過「少用一個存儲單元」來區分「隊滿」與「隊空」狀態,避免額外標誌位或計數器。本文給出完整、規範的 C 語言實現,包含初始化、銷毀、入隊、出隊、查長度、取隊首隊尾、遍歷輸出等核心操作。
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType* data; // 動態數組基址
int front; // 隊首索引
int rear; // 隊尾索引(指向下一個插入位置)
} SqQueue;
void Init_SqQueue(SqQueue* Q) {
Q->data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
if (!Q->data) exit(EXIT_FAILURE);
Q->front = Q->rear = 0;
}
void Destroy_SqQueue(SqQueue* Q) {
if (Q->data) {
free(Q->data);
Q->data = NULL;
}
Q->front = Q->rear = 0;
}
void Clear_SqQueue(SqQueue* Q) {
Q->front = Q->rear = 0;
}
int IsEmpty_SqQueue(const SqQueue* Q) {
return Q->rear == Q->front;
}
int IsFull_SqQueue(const SqQueue* Q) {
return (Q->rear + 1) % MAXSIZE == Q->front;
}
int GetLength_SqQueue(const SqQueue* Q) {
return (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}
int GetHead_SqQueue(const SqQueue* Q, ElemType* x) {
if (IsEmpty_SqQueue(Q)) return 0;
*x = Q->data[Q->front];
return 1;
}
int GetRear_SqQueue(const SqQueue* Q, ElemType* x) {
if (IsEmpty_SqQueue(Q)) return 0;
int idx = (Q->rear - 1 + MAXSIZE) % MAXSIZE;
*x = Q->data[idx];
return 1;
}
int En_SqQueue(SqQueue* Q, ElemType x) {
if (IsFull_SqQueue(Q)) return 0;
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
int De_SqQueue(SqQueue* Q, ElemType* x) {
if (IsEmpty_SqQueue(Q)) return 0;
*x = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
void Print_SqQueue(const SqQueue* Q) {
if (IsEmpty_SqQueue(Q)) {
printf("Queue empty\n");
return;
}
int i = Q->front;
int len = GetLength_SqQueue(Q);
while (len--) {
printf("%d ", Q->data[i]);
i = (i + 1) % MAXSIZE;
}
printf("\n");
}
int main(void) {
SqQueue Q;
Init_SqQueue(&Q);
ElemType val;
for (int i = 1; i <= 5; ++i) En_SqQueue(&Q, i * 10);
Print_SqQueue(&Q); // 10 20 30 40 50
printf("Length: %d\n", GetLength_SqQueue(&Q)); // 5
De_SqQueue(&Q, &val); printf("Dequeue: %d\n", val); // 10
GetHead_SqQueue(&Q, &val); printf("Head: %d\n", val); // 20
GetRear_SqQueue(&Q, &val); printf("Rear: %d\n", val); // 50
Destroy_SqQueue(&Q);
return 0;
}
| 特性 | 單空槽法 | 計數器法 |
|---|---|---|
| 空間利用率 | MAXSIZE-1 | MAXSIZE |
| 判滿判空邏輯 | 索引運算 | 直接比較 count |
| 並發友好度 | 需額外鎖保護 front/rear | count 原子操作較易 |
| 代碼複雜度 | 稍高(模運算) | 直觀簡單 |
malloc(sizeof(SqQueue) * MAXSIZE) 錯誤,應為 sizeof(ElemType) * MAXSIZE。(rear - 1 + MAXSIZE) % MAXSIZE 確保非負。循環隊列是環形緩衝區、生產者消費者模型、嵌入式數據傳輸的基石。熟練掌握單空槽法的索引運算邏輯,並養成完善的錯誤碼返回習慣,是寫出高質量系統級代碼的基本功。