Vérifiez si les parenthèses dans l'expression correspondent

Emprunter la structure de la pile

Nous utilisons la pile pour stocker la parenthèse gauche sans correspondance et balayer la chaîne de gauche à droite. Lorsque le support gauche est numérisé, il est poussé sur la pile; lorsque le support droit est numérisé, un support gauche est prélevé du haut de la pile. S'il peut correspondre, par exemple, "(" matches ")", "[" matches "]" et "{" matches "}", continuez à analyser les chaînes restantes. Si lors de la numérisation, vous rencontrez des crochets droits sans correspondance ou s'il n'y a pas de données dans la pile, cela signifie qu'il s'agit d'un format non conforme. Lorsque tous les crochets sont analysés, si la pile est vide, la chaîne est dans un format légal; sinon, cela indique qu'il y a un crochet gauche sans correspondance, ce qui est un format illégal.

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



Je suppose que tu aimes

Origine blog.csdn.net/csdniter/article/details/112765346
conseillé
Classement