那麼換你了,給 Kotlin 的 ArrayDeque 增加 Queue 風格的操作吧。就用我剛剛寫的 Stack 風格改一改,很簡單的。」孩子眨眨眼。
我回想了一下,Queue 的操作名稱是 enqueue 和 dequeue,規則是先進先出。
改動比想像中還少,很快就寫出來了:
fun <E> ArrayDeque<E>.enqueue(element: E) = this.addFirst(element)
fun <E> ArrayDeque<E>.dequeue(): E {
if (this.isEmpty()) throw NoSuchElementException("Queue is empty")
return this.removeFirst()
}
fun <E> ArrayDeque<E>.peek(): E? = this.firstOrNull()
我只是把剛剛程式裡的 last 都換成了 first。
「嗯?就這樣?」因為太容易,反而讓我覺得不真實。
「可惜!差一點點。」小孩搖搖頭,「你這樣還是後進先出。enqueue 和 dequeue 不能同時都在同一端操作唷。」
我照著他說的地方修改了一下,總算對了:
fun <E> ArrayDeque<E>.enqueue(element: E) = this.addLast(element)
fun <E> ArrayDeque<E>.dequeue(): E {
if (this.isEmpty()) throw NoSuchElementException("Queue is empty")
return this.removeFirst()
}
fun <E> ArrayDeque<E>.peek(): E? = this.firstOrNull()
小孩點點頭,「這就對了。」
「為什麼操作名稱不和 Stack 統一,都用 push 和 pop 呢?」我忍不住問。
「就是怕你搞混啊。而且很多程式語言本來就不用這兩個詞。比如 Java 用的是 offer 和 poll,Python 用的是 append 和 popleft。」
「寫程式的人總希望不同語言之間能有共通的語法和關鍵字,但設計語言的人卻常想保留自己的特色。」
這番話讓我想起各種手機充電線的規格——也是花了很久才統一成 Type-C。