式の括弧が一致するかどうかを確認します

スタック構造を借りる

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

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))
}



おすすめ

転載: blog.csdn.net/csdniter/article/details/112765346
おすすめ