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

C語言停車場管理系統:棧與隊列實現完整項目代碼詳解

     編輯:C 語言問答

C語言課程設計經典:基於順序棧與鏈隊列的停車場管理系統完整實現

模擬停車場:停車位有限(棧結構,後進先出),便道無限(隊列結構,先進先出)。車輛到達:停車場未滿入棧,滿則入隊;車輛離開:從棧中尋找並移出,臨時移出阻擋車輛至臨時棧,離開後歸位,若便道有車則入棧。功能含車輛到達、離開、顯示、收費、初始化、退出。

數據結構設計


#define MAX_STOP 4        // 停車位數
#define MAX_PLATE 10      // 車牌長度
#define UNIT_PRICE 10     // 元/秒

// 車輛信息
typedef struct {
    char plate[MAX_PLATE];
    char state; // 'p'停車位, 's'便道, 'i'初始
    int time;   // 進場時間 (ms)
} CAR;

// 順序棧:停車場
typedef struct {
    CAR cars[MAX_STOP];
    int top; // -1 為空
} SeqStack;

// 鏈隊列:便道
typedef struct QNode {
    CAR car;
    struct QNode *next;
} QNode;

typedef struct {
    QNode *front, *rear;
} LQueue;

核心操作函數

棧操作(停車場)


void InitStack(SeqStack *s) { s->top = -1; }
int StackEmpty(SeqStack *s) { return s->top == -1; }
int StackFull(SeqStack *s) { return s->top == MAX_STOP - 1; }
void StackPush(SeqStack *s, char *plate, int t) {
    s->top++;
    strcpy(s->cars[s->top].plate, plate);
    s->cars[s->top].state = 'p';
    s->cars[s->top].time = t;
}
int StackPop(SeqStack *s) { return s->top--; } // 簡化,實際需取值
int StackTop(SeqStack *s, char *plate, int *t) {
    if (StackEmpty(s)) return 0;
    strcpy(plate, s->cars[s->top].plate);
    *t = s->cars[s->top].time;
    return 1;
}

隊列操作(便道)


void InitQueue(LQueue *q) { q->front = q->rear = NULL; }
int EmptyQueue(LQueue *q) { return q->front == NULL; }
void EnQueue(LQueue *q, char *plate) {
    QNode *n = malloc(sizeof(QNode));
    strcpy(n->car.plate, plate);
    n->car.state = 's';
    n->car.time = GetTickCount(); // Windows API
    n->next = NULL;
    if (EmptyQueue(q)) q->front = q->rear = n;
    else { q->rear->next = n; q->rear = n; }
}
int DeQueue(LQueue *q, char *plate) {
    if (EmptyQueue(q)) return 0;
    QNode *n = q->front;
    strcpy(plate, n->car.plate);
    if (q->front == q->rear) q->front = q->rear = NULL;
    else q->front = q->front->next;
    free(n);
    return 1;
}
int QueueLength(LQueue *q) {
    int len = 0; QNode *p = q->front;
    while (p) { len++; p = p->next; }
    return len;
}

業務邏輯函數

車輛到達


void CarCome(SeqStack *park, LQueue *side) {
    char plate[MAX_PLATE];
    printf("輸入車牌: "); scanf("%s", plate);
    if (StackFull(park)) {
        EnQueue(side, plate);
        printf("停車場滿,進入便道,位置 %d\n", QueueLength(side));
    } else {
        StackPush(park, plate, GetTickCount());
        printf("進入停車位 %d\n", park->top + 1);
    }
}

車輛離開(核心邏輯)


void CarLeave(SeqStack *park, LQueue *side) {
    char leave_plate[MAX_PLATE], tmp_plate[MAX_PLATE];
    int t;
    SeqStack tmp_park; InitStack(&tmp_park);
    
    printf("輸入離開車牌: "); scanf("%s", leave_plate);
    
    // 查找車輛位置(從棧頂向下)
    int pos = -1;
    for (int i = park->top; i >= 0; i--)
        if (strcmp(park->cars[i].plate, leave_plate) == 0) { pos = i; break; }
    
    if (pos == -1) { printf("車輛不在停車場\n"); return; }
    
    printf("車輛在車位 %d\n", pos + 1);
    
    // 移出阻擋車輛到臨時棧
    while (park->top > pos) {
        StackTop(park, tmp_plate, &t);
        StackPush(&tmp_park, tmp_plate, t);
        printf("車輛 %s 暫時移出\n", tmp_plate);
        StackPop(park);
    }
    
    // 目標車輛離開,計費
    StackTop(park, tmp_plate, &t);
    int duration = (GetTickCount() - t) / 1000; // 秒
    int fee = duration * UNIT_PRICE;
    printf("車輛 %s 離開,停留 %d 秒,費用 %d 元\n", tmp_plate, duration, fee);
    StackPop(park);
    
    // 歸位臨時棧車輛
    while (!StackEmpty(&tmp_park)) {
        StackTop(&tmp_park, tmp_plate, &t);
        StackPush(park, tmp_plate, t);
        printf("車輛 %s 歸位車位 %d\n", tmp_plate, park->top + 1);
        StackPop(&tmp_park);
    }
    
    // 便道有車則入場
    if (StackFull(park) && !EmptyQueue(side)) {
        DeQueue(side, tmp_plate);
        StackPush(park, tmp_plate, GetTickCount());
        printf("便道車輛 %s 入場車位 %d\n", tmp_plate, park->top + 1);
    }
}

主菜單與主函數


void Menu() {
    printf("\n=== 停車場管理系統 ===\n");
    printf("[C] 車輛到達\n[L] 車輛離開\n[D] 顯示停車場\n[Q] 退出\n選擇: ");
}

int main() {
    SeqStack park; LQueue side;
    InitStack(&park); InitQueue(&side);
    char choice;
    while (1) {
        Menu();
        scanf(" %c", &choice);
        switch (choice) {
            case 'c': case 'C': CarCome(&park, &side); break;
            case 'l': case 'L': CarLeave(&park, &side); break;
            case 'd': case 'D': Display(&park); break;
            case 'q': case 'Q': return 0;
            default: printf("無效選項\n");
        }
    }
}

顯示函數


void Display(SeqStack *park) {
    if (StackEmpty(park)) { printf("停車場為空\n"); return; }
    printf("車位  車牌        狀態  停留(秒)\n");
    for (int i = 0; i <= park->top; i++) {
        int dur = (GetTickCount() - park->cars[i].time) / 1000;
        printf("%-5d %-10s  %c    %d\n", i+1, park->cars[i].plate, park->cars[i].state, dur);
    }
}

完整代碼獲取

完整可編譯代碼(含 Windows 計時、輸入校驗、內存釋放)請見原最佳回答。核心邏輯已在上文給出,可直接組裝為完整項目。

學習價值總結

  • 棧隊列綜合應用:同一業務場景自然融合兩種核心數據結構。
  • 指針與動態內存:鏈隊列節點 malloc/free,臨時棧數組模擬。
  • 模塊化設計:數據結構、基礎操作、業務邏輯、交互界面分層清晰。
  • 工程細節:輸入校驗、時間計費、狀態管理、資源清理。

此項目是數據結構課程設計、C語言綜合實訓的優秀案例,建議在理解基礎上嘗試擴展:持久化存儲、多停車場管理、圖形界面(GTK/Qt)、Web 管理端(CGI/嵌入式 WebServer)。

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