1. 程式人生 > 其它 >LeetCode 劍指 Offer 31. 棧的壓入、彈出序列- Go 實現

LeetCode 劍指 Offer 31. 棧的壓入、彈出序列- Go 實現

技術標籤: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,

push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 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
}

歡迎關注程式開發者社群

在這裡插入圖片描述

參考資料