首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言靜態數組實現循環隊列:空滿判斷、入隊出隊完整教程

     編輯:關於C語言

循環隊列核心難點:如何區分「空」與「滿」?

普通隊列尾部入隊、頭部出隊,數組尾部空間無法重用。循環隊列利用模運算讓 head、tail 繞回數組首部。關鍵在於:head == tail 既可能代表空,也可能代表滿。主流解法是犧牲一個存儲單元作為標誌:

  • 空:head == tail
  • 滿:(tail + 1) % MAX_SIZE == head

實際可用容量 = MAX_SIZE - 1。

數據結構與宏定義

#define QUEUE_SIZE 10
static int queue[QUEUE_SIZE];
static int head = 0, tail = 0;   // head 指向隊頭,tail 指向隊尾下一位置

五大核心操作

1. 入隊 EnQueue

void EnQueue(int value) {
    if ((tail + 1) % QUEUE_SIZE == head) {
        printf("隊列已滿,無法入隊\n");
        return;
    }
    queue[tail] = value;
    tail = (tail + 1) % QUEUE_SIZE;
}

2. 出隊 DeQueue

int DeQueue() {
    if (head == tail) {
        printf("隊列為空,無法出隊\n");
        return -1;                // 約定錯誤碼
    }
    int temp = queue[head];
    head = (head + 1) % QUEUE_SIZE;
    return temp;
}

3. 判空 IsEmpty

int IsEmpty() {
    if (head == tail) { printf("隊列為空\n"); return 1; }
    printf("隊列不為空\n"); return 0;
}

4. 判滿 IsFull

int IsFull() {
    if ((tail + 1) % QUEUE_SIZE == head) { printf("隊列已滿\n"); return 1; }
    printf("隊列未滿\n"); return 0;
}

5. 列印隊列 PrintQueue

void PrintQueue() {
    for (int i = head; i != tail; i = (i + 1) % QUEUE_SIZE)
        printf("%d ", queue[i]);
    printf("\n");
}

完整可運行測試程序

#include <stdio.h>
#define QUEUE_SIZE 5    // 實際只能存 4 個元素

int queue[QUEUE_SIZE];
int head = 0, tail = 0;

void EnQueue(int value) { /* 同上 */ }
int DeQueue() { /* 同上 */ }
int IsEmpty() { /* 同上 */ }
int IsFull() { /* 同上 */ }
void PrintQueue() { /* 同上 */ }

int main() {
    EnQueue(4); EnQueue(1); EnQueue(2); EnQueue(9); EnQueue(8); // 第 5 次會提示「已滿」
    PrintQueue();          // 4 1 2 9
    DeQueue(); DeQueue();  // 出 4, 1
    PrintQueue();          // 2 9
    return 0;
}

進階優化方向

痛點優化方案代價
浪費 1 個槽位額外 size 計數器 / tag 標誌位額外內存/邏輯複雜度
固定容量動態數組 + 2倍擴容 + 數據搬移擴容時 O(n) 延遲
非線程安全環形緩衝區 + 原子操作 / 鎖同步開銷

常見錯誤自查

  1. PrintQueue 用 i < tail 而非模運算 → 跨越數組邊界時輸出錯誤。
  2. DeQueue 先移動 head 再取值 → 取到錯誤元素。
  3. 未處理「滿」時入隊、「空」時出隊 → 覆蓋數據或返回垃圾值。

完整代碼已上傳:Queue_Array。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved