數據結構簡介
你好!歡迎來到計算機科學中最重要的一個章節。你可以把數據結構 (Data Structures) 想像成我們用來儲存資訊的「容器」。就像你不會把湯裝進鞋盒,也不會把襪子塞進湯碗裡一樣,程式設計師會根據數據的處理需求來選擇不同的數據結構。
在本指南中,我們將探討如何組織數據,讓程式運作得更順暢、更有效率。如果一開始覺得有些概念很抽象,別擔心——我們會透過大量生活中的例子來幫助你牢牢記住這些知識點!
1. 陣列 (Arrays):井然有序的行列
陣列 (Array) 是一組儲存在同一個名稱下,且數據類型相同的數據集合。想像學校走廊上一排排的置物櫃,每個置物櫃都有一個編號(索引,index),你可以在每個櫃子裡放進一件物品。
一維、二維和三維陣列
課程大綱要求你理解最多三維的陣列。讓我們來拆解一下:
- 一維陣列 (1D Array / Linear): 一個簡單的列表。例子:購物清單或一排置物櫃。
- 二維陣列 (2D Array / Grid): 就像一張表格或棋盤。要找到特定的「櫃子」,你需要行號和列號。例子:試算表或電影院座位表。
重點: 在大多數程式語言中,我們從 0 而不是 1 開始計數。這稱為零基索引 (Zero-based indexing)。因此,陣列中的第一項是在索引 \(0\) 的位置。
快速回顧:陣列特性
1. 它們儲存相同類型的數據(例如:全都是整數)。
2. 它們具有固定的大小(一旦建立,通常無法更改「置物櫃」的數量)。
3. 如果你知道索引,你可以瞬間存取任何項目。
2. 記錄 (Records):數碼身分證
雖然陣列非常適合處理一系列相同的數據(例如 100 個價格),但當你想儲存關於「某個特定事物」的不同類型數據時,就會使用記錄 (Record)。
想像一個學生記錄,它可能包含:
- 學號 (StudentID): 整數 (例如:5021)
- 姓名 (Name): 字串 (例如:"Alice")
- 是否入學 (IsEnrolled): 布林值 (例如:True)
記錄中的每一項獨立資訊稱為欄位 (Field)。
類比: 把記錄想像成實體檔案櫃中的一張卡片,它保存了關於某個人或物件的所有不同類型的資訊。
3. 列表 (Lists) 與元組 (Tuples)
它們看起來可能像陣列,但有一些「個性」上的差異:
列表 (Lists)
列表 (List) 比陣列更靈活。與陣列不同的是,列表在程式執行時通常可以隨意增加或縮小容量。它們是可變的 (Mutable),這是一個專業用語,意思是它們的內容可以被修改。
元組 (Tuples)
元組 (Tuple) 是一種不可變的 (Immutable) 列表——一旦建立就不能更改。
為什麼要用元組? 因為更安全!如果你有一些絕對不應該被更改的數據(例如固定的地標座標,或是某種特定顏色的 RGB 數值),將它們放入元組可以防止意外修改。
記憶小撇步: Tuples(元組)是被 Trapped(困住的/鎖定的),所以它們無法改變!
4. 堆疊 (Stacks):後進先出結構
堆疊 (Stack) 是一種最後放入的項目最先被取出的數據結構。我們稱之為 LIFO (Last-In, First-Out)。
日常類比: 想像自助餐廳的托盤堆,或者一罐品客薯片。你只能拿走最上面的托盤,也只能把新的托盤疊在最上面。
堆疊操作
- Push (推入): 將項目加入堆疊的頂部。
- Pop (彈出): 將堆疊頂部的項目移出。
- Peek (窺視): 查看頂部的項目而不將其移出。
你知道嗎? 電腦上的「復原 (Undo)」按鈕就是使用堆疊!你執行的每一個動作都會被 push 到堆疊中。當你按下復原時,電腦會從頂部 pop 出最後一個動作來撤銷它。
快速回顧:堆疊邏輯
如果你將 A、然後 B、然後 C 推入 (push) 堆疊,你第一個「彈出 (Pop)」出來的項目將會是 C。
5. 佇列 (Queues):先進先出結構
佇列 (Queue) 與堆疊恰恰相反。它遵循 FIFO (First-In, First-Out) 規則。第一個加入隊伍的人就是第一個獲得服務的人。
日常類比: 超級市場的結帳隊伍,或者是雲霄飛車的排隊隊伍。
佇列操作
- Enqueue (加入隊列): 將項目加入佇列的後方 (rear)。
- Dequeue (移出隊列): 從佇列的前方 (front) 移除一個項目。
常見錯誤: 學生常會搞混項目的進出位置。只要記住現實生活中的排隊:你在後面加入 (Enqueue),輪到你時從前面離開 (Dequeue)!
重點總結:堆疊 vs. 佇列
堆疊 (Stack) = LIFO (後進先出)
佇列 (Queue) = FIFO (先進先出)
總結與成功小技巧
如果這些術語現在聽起來只是「名詞」也不要擔心。學習它們的最佳方式是思考數據是如何移動的:
- 使用陣列 (Array) 來處理固定大小、相同類型的清單。
- 使用記錄 (Record) 來將關於同一個事物的不同資訊分組。
- 使用元組 (Tuple) 來儲存必須保持「鎖定」且不可更改的數據。
- 使用堆疊 (Stack) 當你需要記住「最近發生」的事情時(例如「復原」功能)。
- 使用佇列 (Queue) 當你需要按照「到達順序」來處理事務時(例如印表機列印文件)。
最後的小貼士: 在考試中繪製堆疊或佇列時,請務必清楚標記頂部 (Top)(針對堆疊)或前方與後方 (Front and Rear)(針對佇列)。這能向考官證明你真正理解了當中的「指標」運作機制!