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

Java 實現停車場管理系統:棧與隊列的經典數據結構應用

     編輯:Java 相關知識

題目背景

經典教材案例:狹長通道停車場(棧)+ 門外便道(隊列),模擬車輛進出、收費、讓路全流程。本文提供基於順序棧與鏈式隊列的完整 Java 實現。

核心數據結構設計

  • 停車場(棧):順序陣列 Car[] garage,top 指向棧頂,先進後出
  • 便道(隊列):鏈表 QueueNode front/rear,先進先出
  • 臨時讓路棧:順序陣列 Car[] temp,存放為離場車輛挪動的車輛

車輛實體類

class Car {
    String plate;   // 車牌
    int    enterTime; // 進場時間
    Car next;       // 隊列節點指針
}

關鍵算法邏輯

1. 車輛到達(Arrive)

public void arrive(String plate, int time) {
    if (garageTop < MAX_SIZE) {               // 停車場未滿
        garage[++garageTop] = new Car(plate, time);
        System.out.println("車輛 " + plate + " 停入車位 " + (garageTop+1));
    } else {                                   // 停車場已滿,進入便道
        enqueue(waitQueue, new Car(plate, time));
        System.out.println("車輛 " + plate + " 進入便道位置 " + waitQueue.size);
    }
}

2. 車輛離開(Depart)

public void depart(String plate, int time) {
    // 1. 在棧中從頂向下搜尋
    int pos = findInGarage(plate);
    if (pos == -1) { System.out.println("車輛不在停車場"); return; }

    // 2. 將目標車輛上方的車臨時移至 temp 棧
    for (int i = garageTop; i > pos; i--) {
        temp[++tempTop] = garage[i];
    }

    // 3. 彈出目標車輛並計費
    Car target = garage[pos];
    int fee = (time - target.enterTime) * RATE;
    System.out.println("車輛 " + plate + " 離開,停留 " + (time-target.enterTime) + "小時,收費 " + fee);

    // 4. 將 temp 棧車輛按原序移回 garage
    while (tempTop >= 0) {
        garage[++pos] = temp[tempTop--];
    }
    garageTop = pos; // 更新棧頂

    // 5. 若便道有車,第一輛進入停車場
    if (!waitQueue.isEmpty()) {
        Car next = dequeue(waitQueue);
        garage[++garageTop] = next;
        next.enterTime = time; // 重新計時
        System.out.println("便道車輛 " + next.plate + " 駛入車位 " + (garageTop+1));
    }
}

3. 隊列操作(鏈表實現)

void enqueue(Queue q, Car c) {
    if (q.rear == null) q.front = q.rear = c;
    else { q.rear.next = c; q.rear = c; }
    q.size++;
}

Car dequeue(Queue q) {
    Car c = q.front;
    q.front = q.front.next;
    if (q.front == null) q.rear = null;
    q.size--;
    c.next = null;
    return c;
}

測試數據驗證

輸入序列(n=2):

A 1 5
A 2 10
D 1 15
A 3 20
A 4 25
A 5 30
D 2 35
D 4 40
E 0 0

關鍵輸出片段:

車輛 1 停入車位 1
車輛 2 停入車位 2
車輛 3 進入便道位置 1
車輛 4 進入便道位置 2
車輛 1 離開,停留 10小時,收費 30
便道車輛 3 駛入車位 2
車輛 2 離開,停留 25小時,收費 75
...

擴展建議

  1. 引入 ArrayDeque 替代手寫棧/隊列,生產級代碼更健壯;
  2. 增加車輛類型(月租/臨停)、優先級、多出入口併發控制;
  3. 持久化至資料庫,支援斷電恢復與報表統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved