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

C++ 實現 12306 類系統:火車班次信息的最佳數據結構選擇

     編輯:程式設計疑難解答

需求分析

模擬 12306 核心功能,需存儲每個火車班次的:

  • 班次名(如 G123)
  • 總票數/剩余票數
  • 停靠站序列
  • 各站點間的剩余票數(區間庫存)

方案對比:鏈表 vs 結構體數組 vs 更高級結構

1. 結構體數組—— 推薦入門首選

struct Station {
    std::string name;
    int remainingTickets; // 該站點上車後剩余票數
};

struct Train {
    std::string trainNo;
    int totalSeats;
    std::vector stations; // 動態數組存儲停靠站
};
std::vector trains; // 所有班次

優點:內存連續,緩存友好;隨機訪問 O(1);代碼直觀,易於序列化/持久化;
缺點:插入/刪除班次需移動元素(但班次數相對固定,影響微乎其微)。

2. 鏈表—— 不推薦

雖然插入刪除 O(1),但查找特定班次或站點需 O(N) 遍歷,且指針開銷大,破壞緩存局部性,調試困難。現代 C++ 極少在業務邏輯層手寫鏈表。

3. 進階選擇:unordered_map + vector

// 以班次號為鍵,O(1) 精確查找
std::unordered_map trainMap;
// 站點查詢優化:站點名 -> 經過該站的班次列表
std::unordered_map> stationIndex;

適合大規模數據、高頻查詢場景。

區間票數建模關鍵

「各停靠站剩余票數」實際上是區間庫存。例如北京→上海,中間經濟南、南京:

  • 北京上車、上海下車:佔用 [北京,上海) 所有區段
  • 濟南上車、南京下車:佔用 [濟南,南京) 區段

建議在 Train 中維護 std::vector segmentTickets,長度為 stations.size()-1,每個元素代表相鄰兩站間的剩余座位數。售票時檢查並扣減相關區段。

總結建議

  1. 初學/中小項目:直接使用 struct + std::vector,結構清晰,性能足夠。
  2. 大規模/高併發:引入 unordered_map 索引,考慮鎖或無鎖結構保護共享數據。
  3. 持久化:結構體數組易於直接二進制讀寫或 JSON 序列化。

核心原則:先用最簡單的結構跑通業務,再根據性能分析優化。過早優化是萬惡之源。

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