判斷括號字串是否合法?
我們的表示式中常常有一些括號包裹,程式語言語法檢查的時候會判斷括號是否匹配正確,常用的就是用棧結構。
"[[()]]" //合法
"{[)}" //不合法
演算法思路:
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 協議》,轉載必須註明作者和本文連結