Go语言实战案例-括号匹配算法

在编译器、表达式求值、代码格式化等场景中,我们经常需要判断括号是否成对匹配且顺序正确 。这是一个经典的栈(Stack)应用问题。


一、问题描述

给定一个字符串,判断其中的括号是否匹配。括号可能包括:

  • • () 圆括号
  • • [] 方括号
  • • {} 花括号

要求:

  • • 每个左括号必须有对应的右括号
  • • 括号必须按正确的嵌套顺序闭合

示例

输入 输出
"()" true
"(\[\]{})" true
"(]" false
"()" false
"{()()}" true

二、算法思路

    1. 使用栈保存未匹配的左括号
    1. 遍历字符串:
    • • 遇到左括号 (、[、{ → 压入栈
    • • 遇到右括号 )、]、} → 弹出栈顶元素,判断是否是对应的左括号
    • • 若不匹配或栈为空 → 返回 false
    1. 遍历结束后,如果栈不为空 → 返回 false
    1. 否则 → 返回 true

三、Go语言实现

go 复制代码
package main

import (
    "fmt"
)

func IsValidBrackets(s string) bool {
    stack := []rune{}
    pairs := map[rune]rune{
        ')': '(',
        ']': '[',
        '}': '{',
    }

    for _, ch := range s {
        switch ch {
        case '(', '[', '{':
            stack = append(stack, ch) // push
        case ')', ']', '}':
            if len(stack) == 0 || stack[len(stack)-1] != pairs[ch] {
                return false
            }
            stack = stack[:len(stack)-1] // pop
        }
    }

    return len(stack) == 0
}

func main() {
    tests := []string{"()", "([]{})", "(]", "([)]", "{[()()]}"}
    for _, t := range tests {
        fmt.Printf("%s -> %v\n", t, IsValidBrackets(t))
    }
}

输出

rust 复制代码
() -> true
([]{}) -> true
(] -> false
([)] -> false
{[()()]} -> true

四、复杂度分析

  • • 时间复杂度:O(n),只需一次遍历
  • • 空间复杂度:O(n),栈最多存储 n 个字符

五、进阶扩展

✅ 1. 增加其他符号

可以扩展 pairs 表,支持 <> 或自定义符号。

✅ 2. 忽略非括号字符

在表达式中可能包含数字、运算符,可以在 switch 中只处理括号。

✅ 3. 处理大规模数据

当输入很大时,可以考虑流式处理(分块判断)。


六、总结

通过本篇案例,你学习了:

  • • 使用栈解决括号匹配问题
  • • Go 语言中 map、slice 的基本操作
  • • 如何分析算法的时间和空间复杂度

栈的应用非常广泛,除了括号匹配,还可用于表达式求值、撤销操作、DFS搜索等场景。


相关推荐
ZhengEnCi3 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go3 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD3 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi5 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj5206 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3276 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李7 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒8 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish8 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术8 小时前
为什么越来越多人用Arthas 4 ?
后端