栈的基础应用-LeetCode20有效的括号(Go语言)

题目

题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:
输入:s = “()”
输出:true

示例 2:
输入:s = “()[]{}”
输出:true

示例 3:
输入:s = “([)]”
输出:false

示例 4:
输入:s = “{[]}”
输出:true

思路(流程图):

  1. 遍历字符串,遇到左方向的括号就把字符push入栈
  2. 遇到右方向的括号的字符b2,就pop栈中的一个字符b1出来,检查是否匹配:若匹配,则检查下一个;若不匹配,直接返回false,结束检查
  3. 遍历完字符串后,检查栈内是否还有元素:如果有,代表匹配失败,返回false; 如果没有,匹配成功,返回true;

在这里插入图片描述
代码(Go语言):

//先定义一个栈结构
type stack struct {
	top int
	data []byte
}

//栈结构方法-入栈
func (s *stack) push(b byte) {
	s.data = append(s.data, b)
	s.top++
}
//栈结构方法-出栈
func (s *stack) pop() byte{
	b := s.data[len(s.data)-1]
	s.data = s.data[:len(s.data)-1]
	s.top--
	return b
}

//栈结构方法-是否为空栈
func (s *stack) isEmpty() bool{
	return len(s.data) == 0
}

//判断是否为有效的括号
func isValid(s string) bool {
	if len(s) == 1 {
		return false
	}
	byteslice := []byte(s)
	helpstack := &stack{top: -1}
	for i := 0; i < len(s); i++ {
		if byteslice[i] == '(' || byteslice[i] == '[' || byteslice[i] == '{' {
			helpstack.push(byteslice[i])
		}else if byteslice[i] == ')' || byteslice[i] == ']' || byteslice[i] == '}' {
			if helpstack.isEmpty() {
				return false
			}else{
				b1 := helpstack.pop()
				if ! match(b1, byteslice[i]) {
					return false
				}
			}
		}else{
			return false
		}
	}
	return helpstack.isEmpty()
}

//判断字符是否匹配
func match(b1, b2 byte) bool {
	if (b1 == '('  && b2 == ')') || (b1 == '['  && b2 == ']') || (b1 == '{'  && b2 == '}'){
		return true
	}
	return false
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值