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

C語言實戰:基於循環隊列實現銀行排隊叫號系統

     編輯:關於C語言

C語言實戰:基於循環隊列實現銀行排隊叫號系統

隊列(Queue)作為「先進先出」(FIFO)的經典資料結構,天然契合銀行排隊、訂單處理、任務調度等業務場景。本文通過一個完整的銀行排隊叫號系統案例,演示如何在C語言中封裝循環隊列,並實現取號、叫號、查詢排隊人數等核心功能。

一、 系統設計與資料結構定義

假設已有一個成熟的循環隊列介面seqQueue.h,提供以下核心操作:

  • SEQQUEUE *queue_init():初始化隊列
  • int queue_push(SEQQUEUE *q, DATATYPE_T data):入隊(取號)
  • DATATYPE_T *queue_pop(SEQQUEUE *q):出隊(叫號)
  • int queue_empty(SEQQUEUE *q):判斷隊空
  • int queue_full(SEQQUEUE *q):判斷隊滿
  • int get_queue_length(SEQQUEUE *q):獲取當前排隊人數

資料元素DATATYPE_T包含號碼與取號時間:

typedef struct {
    int number;      // 排隊號碼
    time_t time;     // 取號時間戳
} DATATYPE_T;

二、 核心業務邏輯實現

1. 取號功能 add_queue()

int g_number = 0; // 全域變數:當前最大號碼

int add_queue(SEQQUEUE *queue) {
    if (queue_full(queue)) {
        printf("排隊人數已達上限,請稍後再試。\n");
        return -1;
    }
    DATATYPE_T data;
    data.number = ++g_number;      // 號碼遞增
    data.time = time(NULL);        // 記錄當前時間
    queue_push(queue, data);       // 入隊
    printf("取號成功,您的號碼是:%d\n", data.number);
    return 0;
}

2. 叫號功能 next()

void next(SEQQUEUE *queue) {
    if (queue_empty(queue)) {
        printf("當前無排隊客戶。\n");
        return;
    }
    DATATYPE_T *data = queue_pop(queue); // 出隊
    printf("請 %d 號客戶到 %d 號窗口辦理業務。\n", data->number, 1); // 簡化窗口邏輯
}

3. 選單與主迴圈

int menu() {
    printf("********************\n");
    printf("1. 取號\n");
    printf("2. 叫號\n");
    printf("0. 退出系統\n");
    printf("********************\n");
    printf("請輸入選項: ");
    return 0;
}

int main() {
    SEQQUEUE *queue = queue_init();
    if (!queue) {
        printf("隊列初始化失敗!\n");
        return -1;
    }

    int opt = 0;
    do {
        menu();
        scanf("%d", &opt);
        switch (opt) {
            case 1:
                add_queue(queue);
                printf("當前等待人數: %d\n", get_queue_length(queue));
                break;
            case 2:
                next(queue);
                printf("當前等待人數: %d\n", get_queue_length(queue));
                break;
            case 0:
                printf("系統已退出。\n");
                break;
            default:
                printf("無效選項,請重新輸入。\n");
        }
    } while (opt != 0);

    // 實際專案中應釋放隊列記憶體
    return 0;
}

三、 關鍵技術點總結

  1. 循環隊列避免假溢出: 透過(rear+1)%maxSize == front判滿,front == rear判空,充分利用陣列空間。
  2. 模組化設計: 隊列操作封裝於seqQueue.h/.c,主程式僅調用介面,降低耦合,便於維護與擴展(如改用鏈式隊列)。
  3. 時間戳記錄: 引入time.h記錄取號時間,可擴展統計平均等待時長等進階功能。
  4. 錯誤處理: 入隊前檢查隊滿,出隊前檢查隊空,避免非法記憶體訪問。

四、 擴展建議

  • 多窗口支援: 引入窗口結構體,叫號時指定空閒窗口。
  • 優先級隊列: 為VIP、老年客戶設置優先級,插隊邏輯調整為優先級插入。
  • 持久化: 將隊列狀態定期寫入檔案/資料庫,防止斷電丟失資料。
  • 圖形化介面: 結合Qt、GTK或Web前端,實現大屏顯示、語音播報。

這個案例展示了資料結構解決實際問題的威力。掌握隊列的封裝與應用,是C語言從「寫代碼」邁向「做工程」的關鍵一步。

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