借用栈结构
我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式。当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。
package main
import (
"errors"
"fmt"
)
type Stack struct {
arr []interface{
} //切片
stackSize int //栈中元素的个数
}
func NewStack()Stack {
stack:=Stack{
arr:make([]interface{
},0)}
return stack
}
//push栈元素
func (s *Stack) push(t interface{
}) {
s.arr = append(s.arr, t)
s.stackSize += 1
}
//pop栈元素
func (s *Stack) pop() interface{
} {
if s.stackSize > 0 {
//栈不为空时
s.stackSize--
element := s.arr[s.stackSize]
s.arr = s.arr[:s.stackSize]
return element
}
return errors.New("栈为空")
}
// 判断表达式中的括号是否匹配
func pipe(elem string)bool {
stack:=NewStack()
for _,i:=range elem{
switch string(i) {
case "(","[","{":
stack.push(string(i))
case ")","]","}":
if stack.pop()==string(i) {
continue
}else {
return false
}
}
}
if stack.stackSize!=0{
return false
}
return true
}
func main() {
elem:="{[}()]"
fmt.Println(pipe(elem))
}