Stack 堆疊 與 Queue 列隊
通常會放在一起講,兩種都是屬於抽象的資料類型,只是一種概念,在軟體工程中被廣泛運用。
可用任何方式實現 stack & queue,如: 連結串列(Linked List)、陣列(Array)。
stack 堆疊
像在堆石頭的一樣,只能從上方一直疊上去,要讓石頭變少,也是上方移除。
特性
- 後進先出 LIFO(Last in first out)
- 元素沒有 index
- 元素的新增與移除只能從 stack 的上方
使用 Linked List 實作 Stack
如果不了解 Linked List 的,可以參考這一篇 Linked List(連結串列)。
在 Stack 的概念中,我們建立的 Linked List 只能使用 push
, pop
方法,不能使用 shift
, unshift
, insertAt
, removeAt
。
要實作的方法:
push: 在最上層新增元素
pop: 把最上層的元素移除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| const Node = (value) => { return { value, next: null } }
const Stack = () => { let head = null let length = 0 const push = (value) => { let newNode = Node(value) if (head === null) head = newNode else { let currentNode = head while (currentNode.next !== null) { currentNode = currentNode.next } currentNode.next = newNode }
length++ } const pop = () => { if (head === null) return null if (length === 1) { let node = head head = null length = 0 return node } let currentNode = head while (currentNode.next.next !== null) { currentNode = currentNode.next } let popNode = currentNode.next currentNode.next = null length-- return popNode }
const printAll = () => { if (head === null) { console.log('Nothing in this linked list') return }
let currentNode = head while (currentNode !== null) { console.log(currentNode.value) currentNode = currentNode.next } }
return { head, length, push, pop, printAll } }
let myStack = Stack() myStack.push('Mike') myStack.push('Harry') myStack.push('James') myStack.pop() myStack.printAll()
|
印出結果:
Mike
Harry
Stack 觀念練習題
以下會提供一系列的運算,請試著回答問題:
- 當運算都結束後,stack 內還有幾個項目?
- stack 的最上方(top)是什麼?
1 2 3 4 5 6 7 8
| push flour push milk push eggs pop push leavening push sugar pop pop
|
答案
最後 stack 會剩下兩個元素
milk(top)
flour
LeetCoode 練習題
20. Valid Parentheses
155. Min Stack
1047. Remove All Adjacent Duplicates In String
評論