把 Stack 想成一個只能從上方開口的品客洋芋片罐,遵守 Last-In-First-Out (LIFO) 原則。
在程式實作上(ArrayStack),你可以把它想像成一個垂直的置物櫃(陣列),而 top 是管理員的手,永遠指向「最後放進去的那件物品」。初始狀態下置物櫃是空的,所以 top 的初始值為 -1(地下室)。
一開始為空堆疊。依序執行下列 6 個動作,寫出堆疊由 底層到頂層 的內容(Content)。可以做的動作包含:
(i) Push 400
目前 Content: [400]
(ii) Push 500(提示:把 500 疊在 400 上面)
目前 Content: [400, 500]
(iii) Pop(提示:最上面的 500 被拿走了)
目前 Content: [400]
(iv) Pop(提示:又把最上面的 400 拿走了)
目前 Content: [](空)
(v) Push 300
目前 Content: [300]
(vi) Top(教授提示:top 只是偷看,不會把東西拿走)
目前 Content: [300]
補充:此動作會 return 300 給程式,但不會改變堆疊內容。
❌ 錯誤的答案:
return array[i];
問題:這會回傳陣列內容,且程式中並未定義變數 i。題目要求的是「元素數量」。
✅ 正確答案:
return top + 1;
解析:陣列索引從 0 開始,當 top 為 0 時代表有 1 個元素;因此數量為 top + 1。
❌ 錯誤的答案:
if (array[i] == 0) { return true; } else { return false; }
問題:判斷堆疊是否為空應該檢查 top 指標,而不是去檢查陣列內容。
✅ 正確答案:
return top == -1;
解析:當 top 等於 -1 時,代表堆疊為空。寫成 return size() == 0; 也完全可以接受。
❌ 錯誤的答案:
return array[i];
問題:這只是回傳元素,並沒有改變指標把它從堆疊中「移除」。
✅ 正確答案:
return array[top--];
解析:pop() 要「移除並回傳」。使用後置遞減 top-- 可以先回傳目前 top 指向的元素,然後再把 top 減一。若不想用一行寫法,也可拆成三行:
Object item = array[top];
top--;
return item;
所有操作都圍繞著 top 指標轉動:
array[++top] = item;return array[top--];top pointer is initialized to -1, indicating an empty stack.pop operation removes and returns the top element of the stack.top-- is used in pop() to return the current element and then decrease the pointer.把這個陣列堆疊(ArrayStack)的運作機制搞懂後,面對變形題(例如限制型別、擴充容量、或回傳錯誤處理)都能輕鬆應對。準備好了就可以繼續進入 Section A 的最後一題:Question A4(Queue 與 Circular Array)。