检查表达式中的括号是否匹配

借用栈结构

我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式。当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。

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