「原來如此,我懂了為什麼寢室不能算作 Stack。」我恍然大悟地說,「如果我們進來寢室後馬上又原路倒車出去,才符合 Stack 的進出方式。可平常進來之後大家就散開到各自的座位,入口和出口的規則就亂掉了。」
孩子拍拍手,露出肯定的笑容:「沒錯嘛,你總算抓到重點了。」
我越想越覺得有趣,忍不住追問:「既然和 Queue 這麼像,那它的新增和刪除時間複雜度應該也是 O(1) 吧?」
「聰明!」孩子眯起眼睛,「事實上,只要稍微改一改 Queue 的程式碼,就能做出 Stack。」
他說著,揮了揮手,眼前的空氣像是螢幕般亮起,浮現出一段程式碼:
class Node<T>(val value: T, var next: Node<T>? = null)
class Stack<T> {
private var top: Node<T>? = null
fun push(element: T) {
val newNode = Node(element)
newNode.next = top
top = newNode
}
fun pop(): T? {
val currentTop = top ?: return null
top = currentTop.next
return currentTop.value
}
fun peek(): T? = top?.value
fun isEmpty(): Boolean = top == null
}
「咦?Queue 是用頭尾,可是 Stack 這裡怎麼用的是『頂端』而不是頭?」我皺起眉頭。
孩子歪著腦袋,笑得一副理所當然的樣子:「Queue 在現實裡大多是沿著地面排開的,所以看起來是橫向的。可 Stack 不一樣,它是直直往上疊的,中文才叫『堆疊』啊!東西一定是往最上面放。你想想看——要是你把串燒顛倒過來拿,尖端朝下,不怕肉一塊塊滑掉嗎?」