資料結構和演算法——棧的面試演算法

littlexiaoshuishui發表於2020-08-29

判斷括號字串是否合法?

我們的表示式中常常有一些括號包裹,程式語言語法檢查的時候會判斷括號是否匹配正確,常用的就是用棧結構。

"[[()]]" //合法
"{[)}" //不合法

演算法思路:

1.遍歷字串,如果是左括號,就壓入棧中,如果是右括號,就判斷
2.判斷的方法,首先看棧是否為空,如果為空,則說明字串非法。再看看Pop()出來的元素是否與之配對,不配對就是非法,如果配對就進行下一迴圈。
3.字串遍歷完後,如果棧還是不為空,則說明字串非法

func main(){
    str := "[[]"
    res := checkStr(str)
    fmt.Println(res)
}
func checkStr(str string) bool{
    stack := util.NewStack()
    charMap := map[string]string{")":"(", "]":"[", "}":"{"} //先定義配對的map,右括號為鍵
    str2 := []rune(str)
    for i:=0; i< len(str2); i++{
        char := string(str2[i])
        if value,ok := charMap[char]; !ok{ //如果是左括號,壓入棧
            stack.Push(char)
        }else if stack.Len == 0 || (stack.Pop() != value){ //如果是右括號,判斷彈出的字元是否與之匹配
            return false
        }
    }
    if stack.Len == 0 {
        return true
    }else{
        return false
    }
}

go使用切片來實現簡單stack

//使用切片來實現棧
type Stack struct{
    Len int
    s []interface{}
}
func NewStack() *Stack{
    return &Stack{0,make([]interface{},0)}
}
func (stack *Stack)Pop() interface{}{
    if stack.Len == 0{
        return nil
    }else{
        res := stack.s[stack.Len-1] //獲取棧頂元素
        stack.s = stack.s[:stack.Len-1] //刪除棧頂元素
        stack.Len--
        return res
    }
}
func (stack *Stack)Push(data interface{}){
    defer func() {
        stack.Len++
    }()
    stack.s = append(stack.s, data)
}
func (stack *Stack)Print(){
    fmt.Println(stack.s)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章