書籍資訊
- 書名:
《圖解演算法:使用 C#》 - 類型:線性資料結構與經典題型整理
這篇在講什麼
這一篇主要整理幾個彼此很常一起出現的主題:
- Stack 的操作方式
- Queue 的操作方式
- 雙端佇列與優先佇列
- 河內塔與八皇后這類典型遞迴 / 回溯問題
堆疊 Stack
Stack 的規則很單純:
- 後進先出,
Last In First Out
最常見操作:
PushPopPeek
它常出現在:
- 函式呼叫堆疊
- 括號匹配
- DFS
- 表達式處理
如果用一句話記:
Stack 適合處理「最近放進去的東西,最先拿出來」的問題。
佇列 Queue
Queue 則是另一套順序:
- 先進先出,
First In First Out
最常見操作:
EnqueueDequeue
它常用在:
- 排程
- 任務等待列
- BFS
- 訊息緩衝
和 Stack 對照很好記:
- Stack:像疊盤子
- Queue:像排隊
雙端佇列與優先佇列
雙端佇列 Deque
Deque 的特點是兩端都能進出。
它適合:
- 需要從頭尾都操作資料
- 滑動視窗
- 單調佇列
優先佇列 Priority Queue
Priority Queue 不是按先後順序出隊,而是按優先級決定誰先出去。
也就是:
- 高優先級先處理
- 不一定遵守 FIFO
它很常用在:
- 工作排程
- Dijkstra
- A*
這些結構和演算法的關係
很多演算法本身其實不複雜,複雜的是你有沒有選對容器。
例如:
- DFS 常常配合 Stack
- BFS 常常配合 Queue
- 最短路徑常常配合 Priority Queue
所以資料結構不是配角,它會直接決定演算法的執行方式。
河內塔與遞迴
河內塔是很典型的遞迴題。
核心不是移動盤子,而是學會把大問題拆成更小的同型問題。
當有 n 個盤子時,可以拆成三步:
- 先把上面
n - 1個移到中繼柱 - 再把最大那個移到目標柱
- 再把
n - 1個移到目標柱
public static void Hanoi(int n, char from, char helper, char to)
{
if (n == 1)
{
Console.WriteLine($"{from} -> {to}");
return;
}
Hanoi(n - 1, from, to, helper);
Console.WriteLine($"{from} -> {to}");
Hanoi(n - 1, helper, from, to);
}
八皇后與回溯
八皇后問題的核心是回溯 Backtracking。
做法大致是:
- 一列一列放皇后
- 每次只放在目前合法的位置
- 如果某一步無法再放,就退回上一層重選
這類題的本質不是暴力亂試,而是:
- 嘗試
- 檢查
- 不行就撤回
也就是典型的搜尋樹思維。
我自己的整理
這一篇真正要記住的是:
- Stack 和 Queue 不只是資料結構名詞
- 它們其實對應兩種完全不同的處理順序
而像河內塔、八皇后這種題目,表面上在講盤子或棋盤,實際上是在訓練:
- 遞迴拆解
- 搜尋順序
- 狀態回退
先記住的重點
- Stack 是 LIFO,Queue 是 FIFO
- Deque 兩端都能操作,Priority Queue 依優先級出隊
- DFS 常和 Stack 配合,BFS 常和 Queue 配合
- 河內塔是在練遞迴拆解
- 八皇后是在練回溯與合法性檢查