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

C 語言靜態陣列實作循環佇列完整範例

     編輯:關於C語言

前言

循環佇列以固定大小陣列實現 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;
}

關鍵點總結

  • `front` 指向隊頭前一個位置,故入隊先移 `rear` 再存值,出隊先取 `(front+1)%N` 再移 `front`。
  • 模數運算實現環狀重用,避免資料搬移。
  • 「浪費一格」法簡化滿/空判斷,犧牲一個元素空間換取邏輯清晰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved