在 Go语言栈实现 的学习过程中,括号匹配是一个经典且实用的问题。无论你是刚接触 Go编程入门 的小白,还是正在深入理解 数据结构教程 的开发者,掌握如何用栈来判断字符串中的括号是否合法配对,都是非常重要的技能。
括号匹配指的是:给定一个只包含 '('、')'、'['、']'、'{'、'}' 的字符串,判断其中的括号是否成对出现且顺序正确。例如:
()[]{} 是合法的([)] 是非法的(虽然数量相等,但顺序不对)(( 是非法的(缺少右括号)栈是一种“后进先出”(LIFO)的数据结构,非常适合处理这种需要“最近匹配”的场景。当我们遇到左括号时,将其压入栈;遇到右括号时,就从栈顶弹出一个左括号,看是否与当前右括号匹配。如果最后栈为空,说明所有括号都成功配对。
Go语言没有内置的栈类型,但我们可以用切片(slice)轻松实现一个简单的栈。
type Stack struct { items []rune}// 入栈func (s *Stack) Push(item rune) { s.items = append(s.items, item)}// 出栈func (s *Stack) Pop() rune { if s.IsEmpty() { return 0 // 表示空栈 } index := len(s.items) - 1 item := s.items[index] s.items = s.items[:index] return item}// 判断栈是否为空func (s *Stack) IsEmpty() bool { return len(s.items) == 0} 接下来,我们编写核心的括号匹配函数。该函数会遍历字符串中的每个字符,并利用上面定义的栈来判断括号是否合法。
func isValid(s string) bool { stack := &Stack{} // 定义括号映射关系:右括号 -> 左括号 pairs := map[rune]rune{ ')': '(', ']': '[', '}': '{', } for _, char := range s { if char == '(' || char == '[' || char == '{' { // 遇到左括号,入栈 stack.Push(char) } else if char == ')' || char == ']' || char == '}' { // 遇到右括号 if stack.IsEmpty() { return false // 栈空,无左括号可匹配 } top := stack.Pop() if top != pairs[char] { return false // 括号类型不匹配 } } // 忽略非括号字符(根据题目要求可选) } // 最后栈必须为空,才算完全匹配 return stack.IsEmpty()} 下面是一个完整的 Go 程序,包含主函数和几个测试用例:
package mainimport "fmt"// (此处省略 Stack 结构体和方法)// (此处省略 isValid 函数)func main() { testCases := []string{ "()", "()[]{}", "(]", "([)]", "{[]}", "((", } for _, tc := range testCases { result := isValid(tc) fmt.Printf("输入: %-10s → 匹配结果: %t\n", tc, result) }} 运行结果如下:
输入: () → 匹配结果: true输入: ()[]{} → 匹配结果: true输入: (] → 匹配结果: false输入: ([)] → 匹配结果: false输入: {[]} → 匹配结果: true输入: (( → 匹配结果: false 通过本教程,你已经掌握了如何在 Go语言栈实现 的基础上解决 括号匹配算法 问题。这不仅是一个面试高频题,更是理解栈这一 数据结构教程 核心概念的绝佳实践。希望这篇 Go编程入门 教程能帮助你打下坚实的基础!
动手试试吧!修改代码,加入更多括号类型或处理其他符号,加深你的理解。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126246.html