原题链接:20. 有效的括号
思路:
每次将给到的括号和栈顶进行匹配,成功则弹出栈顶元素,不成功则返回false
不成功的有3种情况
1.右括号匹配左括号时时栈为空
2.右括号匹配完后,栈内还有剩余的左括号
2.右括号匹配时,和栈顶元素的左括号不匹配
代码如下:
func isValid(s string) bool {
stack := make([]rune,0)//切片模拟栈
//哈希表用于存储某个右括号对应的左括号
m :=make(map[rune]rune)
m[')'] = '('
m[']'] = '['
m['}'] = '{'
// 遍历字符串中的rune
for _,c := range s{
if c == '(' || c == '[' || c =='{'{
stack = append(stack,c)
}else{//如果是右括号
if len(stack) == 0{//如果栈内没有元素,则代表无法匹配
return false
}
peek := stack[len(stack)-1]//获得栈顶元素,也就是左括号
if peek !=m[c]{//将栈顶元素(右括号)和哈希表中的值(右括号,键为左括号)进行匹配,m[c]等于是m['('],实际上的值为右括号
return false//栈顶元素(右括号)和哈希表中的值不匹配返回false
}
//栈顶弹出
stack = stack[:len(stack)-1]//不匹配的都排除了 只剩下匹配的了
}
}
return len(stack) == 0//全部匹配则应返回true
}