スタック構造を借りる
スタックを使用して、一致しない左括弧を格納し、文字列を左から右にスキャンします。左角かっこがスキャンされると、スタックにプッシュされます。右角かっこがスキャンされると、左角かっこがスタックの一番上から取得されます。たとえば、「(」は「)」に一致し、「[」は「]」に一致し、「{」は「}」に一致する場合は、残りの文字列のスキャンを続行します。スキャン中に右角かっこが一致しない場合、またはスタックにデータがない場合は、不正な形式であることを意味します。すべての角かっこがスキャンされ、スタックが空の場合、文字列は有効な形式です。それ以外の場合は、一致しない左角かっこがあることを示します。これは不正な形式です。
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))
}