定义
- 相较于 array 和 linked-list,stack 和 queue 只支援 pop 或 shift 这类的方法(只能从头或尾取资料),而不能直接取出中间的项目,目的是要限制开发者的操作,以避免对该资料结构做了不适当的操作。
- 只要符合定义的都可以称作是 Stack 或 Queue
Stack 堆叠
- 后进先出 (LIFO, Last in First out)
- 在 JavaScript 中使用 Array 的 push 和 pop 即可实作 Stack

使用情境
- 洗盘子,先被叠上的盘子会最后被洗到,最后被叠上的盘子则会先被洗到。
- 编辑照片或写程式时「上一步」的功能
- 浏览器上一页的功能。
时间複杂度 Time Complexity
| 操作 | Time Complexity 时间複杂度 |
|---|---|
| Lookup | O(n) |
| Pop | O(1) |
| Push | O(1) |
| Peek | O(1),显示下一个会出来的元素,但不会实际把它取出 |
使用 Array 或 Linked List 来实作 Stack 的优缺点
| 功能 | Array | Linked List |
|---|---|---|
| 上一步 | 效能很好 | 除非是 Doubly Linked List,否则 Singly Linked List 在资料结构中并没有保存 previous 的 item,这会使得「上一步」是没有效率的 |
| Push / Pop | 可以非常容易的操作 Push 和 Pop 而不会动到整个 Array 的 index | 操作较複杂 |
| 资料存取效率 | 效能较好,配置在一连串的记忆体空间中(cache locality) | 效能较差,散落在不同的记忆体位置 |
| 记忆体使用 | 有固定 size 的,如果超过了该 size,他会需要 copy 整份到新的位置,这是有可能使得效能下降的原因 | 资料散落在各个不同记忆体互相连结,没有大小问题 |
Queue 伫列
- 先进先出 (FIFO, First in first out)
- 在 JavaScript 中,使用 Array 的 push 和 shift 即可实作 queue

使用情境
- 类似平常在排队,第一个排队的人可以第一个进场
- 购票平台、Uber、印表机列印任务、KTV 点歌
时间複杂度 Time Complexity
| 操作 | Time Complexity 时间複杂度 |
|---|---|
| Lookup | O(n) |
| Enqueue | O(1) |
| Dequeue | O(1) |
| Peek | O(1),检视下一个会出来的元素,但不会实际将它移除 |
为什麽用 Linked List 而不要用 Array 来实作 Queue
- Array 的所有元素都有 index,当我们在进行 Queue 常用的 Dequeue(shift)时,所有阵列元素的 index 都需要一起被改变,因此会非常没有效率。
- Linked List 可以从 head 开始,透过 next 直接往后找下一个是谁。
JavaScript 效能
在 JavaScript 中 shift 和 unshift 的效能较差;push 和 pop 的效能较好。

参考资料
- [资料结构] Stacks and Queues | PJCHENder 未整理笔记
- Stack 堆叠 / Queue 伫列 / Heap 堆 | Node.js 菜鸡修炼场
- Array > Performance @ JavaScript.info
Donate KJ 贊助作者喝咖啡
如果這篇文章對你有幫助的話,可以透過下面支付方式贊助作者喝咖啡,如果有什麼建議或想說的話可以贊助並留言給我
If this article has been helpful to you, you can support the author by treating them to a coffee through the payment options below. If you have any suggestions or comments, feel free to sponsor and leave a message for me!
| 方式 Method | 贊助 Donate |
| PayPal | https://paypal.me/kejyun |
| 綠界 ECPay | https://p.ecpay.com.tw/AC218F1 |
| 歐付寶 OPay | https://payment.opay.tw/Broadcaster/Donate/BD2BD896029F2155041C8C8FAED3A6F8 |