利用栈解决括号匹配问题 -- 算法数据结构面试分享(三)
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,算法数据结构面试分享 符号匹配问题今天在帖子上看见有同学在问,如果一个字符串中包含大括号和小括号,我们该如何解决括号匹配问题。我们今天就一起看下这道题吧。按照我们之前的套路,按部就班来:1. 确保我们
千家信息网最后更新 2025年12月02日利用栈解决括号匹配问题 -- 算法数据结构面试分享(三)
算法数据结构面试分享 符号匹配问题
今天在帖子上看见有同学在问,如果一个字符串中包含大括号和小括号,我们该如何解决括号匹配问题。我们今天就一起看下这道题吧。按照我们之前的套路,按部就班来:
1. 确保我们理解了问题,并且尝试一个例子,确认理解无误。
举个例子,这样的括号是匹配的, ()、{}、({}), ({()}(){}), 而类似于{(、{,({)都是不匹配的。
2. 想想你可以用什么方法解决问题,你会选择哪一种,为什么?
我们拿这个字符串为例,({()}(){}), 最后一个)匹配的是第一个(, 倒数一个}匹配的是倒数第三个。所以我们可以从尾往头扫描,第一个)我们先记录下来,第一个}我们记录下来,第三个{我们发现它和}是匹配的,消除掉,第四个是),我们保存下来,第五个是(,我们发现和第四个匹配,消除掉,依次类推,到最后一个(,我们发现它还最开始的第一个匹配。所以我们自然想到了栈,不匹配我们就入栈,匹配我们就出栈。
3. 解释你的算法和实现的方法
我们申明两个栈,首先将所有字符依次入栈,再逐个出栈,出栈时,我们看下辅助栈里的第一个字符是否匹配,若匹配我们出栈,否则入栈。当主栈里所有字符都出栈时,我们检查辅助栈是否为空。空表示完全匹配,否则不匹配。
4. 写代码的时候,记住,一定要解释你现在在干什么
我们先来定义一个栈,一般我们会借助于数组,这里我们就简单的用列表来处理了,实现它的Pop, Push, IsEmpty 方法,看代码:
public class Mystack { private List list = new List(); public Mystack() { } public Mystack(T[] input) { if (input != null) { for (int index = 0; index < input.Length; index++) { list.Add(input[index]); } } } public T Pop() { if (!this.IsEmpty()) { T element = list[list.Count-1]; list.RemoveAt(list.Count-1); return element; } throw new IndexOutOfRangeException("The stack is empty already."); } public void Push(T element) { list.Add(element); } public bool IsEmpty() { return this.list.Count == 0; } } 接下来,我们看算法:
public static bool IsMatch(string input) { if (!string.IsNullOrEmpty(input)) { Mystack stack = new Mystack(input.ToArray()); Mystack secondStack = new Mystack(); while (!stack.IsEmpty()) { char current = stack.Pop(); if (secondStack.IsEmpty()) { secondStack.Push(current); } else { char target = secondStack.Pop(); if (!IsClosed(current, target)) { secondStack.Push(target); secondStack.Push(current); } } } return secondStack.IsEmpty(); } return false; } 这中间使用了一个IsClosed方法,我们用来匹配 ( 和 ), { 和 }, 看代码:
private static bool IsClosed(char first, char second) { if (first == '(') return second == ')'; if (first == '{') return second == '}'; return false; } 最后我们一起来测试这个方法:
static void Main(string[] args) { string input = "({(){}})"; var result = IsMatch(input); Console.WriteLine(result); } 欢迎大家关注我的公众号,还有我的专题系列:
- 视频教程,
- 数据结构与算法
- 经典算法面试题辅导
- 排序专题讲解
- 链表专题讲解。
大家有什么更好的解法,也欢迎讨论哈。
算法
字符
方法
括号
问题
专题
代码
数据
数据结构
结构
三个
例子
字符串
解释
辅助
按部就班
接下来
两个
公众
同学
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
文献数据库的数据
邯郸亿趣互联网科技有限公司
山东软件开发多不多
股票自动跟单交易软件开发
长春多媒体博物馆软件开发
合肥计算机网络技术培训
战地1服务器怎么改规则
摩申网络技术
互联网科技公司范文
河北运营软件开发
银行网络安全主题科普活动
怎样实现数据库的完整性
杭州全速网络技术有限公司邮编
开展网络安全知识300字作文
网络安全命运共同体思考
网络安全知识竞赛库
dellr830服务器配置
澳洲网络安全移民
数据库 事物
vb连接mdb数据库
网络安全员学什么
真正的网络安全大赛视频
万得的金融终端是什么数据库
揽众网络安全手抄报
数据库 分开 好 网站
奉贤区数据软件开发质量
济南同城互联网科技有限公司
工控制网络安全
力软敏捷框架数据库
互联网 科技电子 董事长