LeetCode 劍指 Offer 31. 棧的壓入、彈出序列- Go 實現
阿新 • • 發佈:2021-02-12
技術標籤:ACM
劍指 Offer 31. 棧的壓入、彈出序列
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 {1,2,3,4,5} 是某棧的壓棧序列,序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列,但 {4,3,5,1,2} 就不可能是該壓棧序列的彈出序列。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
輸出:true
解釋:我們可以按以下順序執行:
push(1), push(2), push(3), push(4), pop() -> 4,
示例 2:
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
輸出:false
解釋:1 不能在 2 之前彈出。
AC 程式碼
func validateStackSequences(pushed []int, popped []int) bool { len1 := len(pushed) len2 := len(popped) stack := new(Stack) stack.data = list.New() var arr []int if len1 > len2 { arr = pushed } else { arr = popped } i := 0 j := 0 for i < len(arr) { a := pushed[i] // b := popped[j] stack.push(a) for !stack.isEmpty() && stack.top() == popped[j] { //fmt.Println(a, b, stack.size) stack.pop() j++ } //fmt.Println(stack.top()) i++ } for j < len(popped) { c := popped[j] //fmt.Println("poped", j, stack.top(), c) if stack.top() == c { stack.pop() } j++ } return stack.isEmpty() } type Stack struct { data *list.List size int } func (q *Stack) pop(){ if q.size > 0 { tmp := q.data.Back() q.data.Remove(tmp) q.size-- } } func (q *Stack) push(val interface{}){ q.data.PushBack(val) q.size++ } func (q *Stack) top() interface{} { if q.size > 0 { return q.data.Back().Value } else { return nil } } func (q *Stack) isEmpty() bool { return q.size == 0 }