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

C 語言基於數組實現循環隊列:完整代碼與操作詳解

     編輯:關於C

前言

隊列是先進先出(FIFO)的線性結構。用數組實現時,為避免數據搬移,採用循環數組(環形緩衝區)配合 `Front`、`Rear`、`Size` 三個索引/計數器。本文提供完整、可編譯運行的 C 實現。

數據結構定義


#define MinQueueSize 5

typedef struct QueueRecord *Queue;

struct QueueRecord {
    int Capacity;   // 數組容量
    int Front;      // 隊頭索引
    int Rear;       // 隊尾索引(指向最後一個元素)
    int Size;       // 當前元素個數
    int *Array;     // 動態分配的數組
};

核心操作實現

1. 創建隊列


Queue CreateQueue(int capacity) {
    if (capacity < MinQueueSize) {
        fprintf(stderr, "Queue size too small\\n");
        exit(1);
    }
    Queue Q = malloc(sizeof(struct QueueRecord));
    Q->Array = malloc(sizeof(int) * capacity);
    if (!Q || !Q->Array) { fprintf(stderr, "Out of space\\n"); exit(1); }
    Q->Capacity = capacity;
    Q->Size = 0;
    Q->Front = 0;
    Q->Rear = -1;  // 空隊列約定
    return Q;
}

2. 判斷滿/空


int IsEmpty(Queue Q) { return Q->Size == 0; }
int IsFull(Queue Q)  { return Q->Size == Q->Capacity; }

3. 入隊


void Enqueue(Queue Q, int X) {
    if (IsFull(Q)) { fprintf(stderr, "Full queue\\n"); return; }
    Q->Rear = (Q->Rear + 1) % Q->Capacity;  // 環形遞增
    Q->Array[Q->Rear] = X;
    Q->Size++;
}

4. 出隊


void Dequeue(Queue Q) {
    if (IsEmpty(Q)) { fprintf(stderr, "Empty queue\\n"); return; }
    Q->Front = (Q->Front + 1) % Q->Capacity;
    Q->Size--;
}

5. 獲取隊頭元素(不刪除)


int Front(Queue Q) {
    if (IsEmpty(Q)) { fprintf(stderr, "Empty queue\\n"); exit(1); }
    return Q->Array[Q->Front];
}

6. 打印隊列(調試用)


void ShowQueue(Queue Q) {
    if (IsEmpty(Q)) { printf("Queue empty\\n"); return; }
    printf("Front=%d Rear=%d Size=%d: ", Q->Front, Q->Rear, Q->Size);
    for (int i = 0, idx = Q->Front; i < Q->Size; i++, idx = (idx + 1) % Q->Capacity) {
        printf("%d%s", Q->Array[idx], (i == Q->Size - 1) ? "\n" : ", ");
    }
}

測試主程序


int main(void) {
    Queue Q = CreateQueue(10);
    Enqueue(Q, 1); Enqueue(Q, 2); Enqueue(Q, 3);
    Enqueue(Q, 4); Enqueue(Q, 5); Enqueue(Q, 6);
    ShowQueue(Q);  // 1,2,3,4,5,6

    Dequeue(Q);    // 刪除 1
    Enqueue(Q, 12); // 入隊 12
    ShowQueue(Q);  // 2,3,4,5,6,12

    // 測試環形繞回
    for (int i = 0; i < 5; i++) Dequeue(Q);
    ShowQueue(Q);  // 12
    Enqueue(Q, 99);
    ShowQueue(Q);  // 12,99

    return 0;
}

關鍵點總結

  1. Rear 初值 -1:配合 `Size==0` 判空,入隊先 `Rear = (Rear+1)%Cap` 再存值,邏輯最清晰。
  2. 模運算實現環形:`(idx + 1) % Capacity` 自動處理數組末尾繞回開頭。
  3. Size 字段:區分「滿」與「空」(若無 Size,Front==Rear 既可能是空也可能是滿,需犧牲一個槽位或引入標誌位)。
  4. 動態分配數組:`CreateQueue` 參數化容量,靈活適應不同場景。

擴展方向

  • 泛型隊列:`void *Array` + 元素大小 `elemSize`,配合 `memcpy` 存取任意類型。
  • 線程安全:加互斥鎖/條件變量實現生產者-消費者模型。
  • 雙端隊列:同時支持頭尾插刪,需雙向鏈表或雙指針環形數組。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved