本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

假设我们有一个复杂的字符串,里边包含了多种括号的嵌套,如下图:

这时候人为地用肉眼去判断其中的括号是否匹配是一件非常麻烦的事,不仅耗时耗力,而且准确率极低。那么,有什么方法可以帮助我们高效地进行判断呢,根据栈的特点,我们可以很容易地想到利用python中的list来模拟栈结构进行判断。

示例:

输入:((ABCD(x)

输出:False

输入:{[(rttyy)]sss}

输出:True

解决方案

我们用栈来保存未匹配的左括号,利用for循环从左到右依次遍历字符串的每个元素。当遍历到左括号时,则将其压入栈中;当遍历到右括号时,从栈顶取出一个左括号。如果能够匹配,则继续遍历剩下的字符串。如果遍历的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明该字符串的括号匹配有误,直接返回False。当所有的括号都扫描完成之后,如果栈为空则说明该字符串的括号全部匹配正确,返回True;如果栈不为空,说明有未匹配的左括号,则返回False。

# coding:utf-8

def BracketMatch(str):

#把左括号与右括号分别放在一组

LeftBrackets  = '{[('

RightBrackets = '}])'

#根据括号的匹配关系建立一个字典,右括号当key,左括号当value

Brackets = {'}':'{',']':'[',')':'('}

# 建立一个栈,初始值为空列表

Stack = [ ]

for char in (str):

if char in LeftBrackets:

Stack.append(char)

if char in RightBrackets:

if Stack == [ ]:

return False

else:

if Brackets[char] == Stack[-1]:

Stack.pop()

else:

return False

if Stack == [ ]:

return True

else:

return False

str = input('请输入字符:')

print(BracketMatch(str))

运行结果如下图:

结语

此题难度一般,最关键的是要理解栈结构的特点,就是后进先出,了解了栈的特点后再运用遍历和嵌套判断便可解决这个问题。当然,这只是其中一种解决办法,我们只有通过不断地学习才能写出更优的算法和代码。

实习编辑:王晓姣

作者:唐雷清,祝菱晞,刘紫轩

稿件来源:深度学习与文旅应用实验室(DLETA)

算法创作|栈的应用——括号匹配问题解决方法相关推荐

  1. 栈的应用--括号匹配的检验

    算法中设置一个栈,每次读入一个括号,若是右括号,则或者与置于栈顶的括号匹配,或者是不合法的情况,若是左括号,则入栈.若算法结束,栈是空的,则括号合法. 括号匹配函数 Status bracket_ma ...

  2. 栈应用之括号匹配(C语言)

    { ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的.] } ) 宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号 ...

  3. 栈应用之 括号匹配问题(Python 版)

    栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出 ...

  4. 数据结构实验之栈四:括号匹配

     数据结构实验之栈四:括号匹配 Description 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. Inp ...

  5. sdut 数据结构实验之栈四:括号匹配

    数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description ...

  6. c语言栈训练题目:括号匹配

    c语言栈训练题目:括号匹配 基本思路: 当前字符不是括号,不做处理: 当前字符是左括号,则进栈: 当前字符是右括号:若栈空,则表明该"右括号"多余,不匹 配,结束:否则和栈顶元素比 ...

  7. 栈的应用 括号匹配 c++

    在算术表达式中,除了加.减.乘.除等运算外,往往还有括号.包括有大括号{},中括号[],小括号(),尖括号<>等. 对于每一对括号,必须先左边括号,然后右边括号:如果有多个括号,则每种类型 ...

  8. JAVA栈应用之括号匹配

    JAVA栈应用之括号匹配 在数据处理中,常常要判断数据中的括号,应用栈来处理及其方便. 当用户输入一个字符串时,遇到左括号时,将其入栈,如'(' '["'{,而遇到右括号时,如')" ...

  9. c语言一串字符括号配对,C语言实现括号匹配的方法

    1 要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"."{}"."[]"三种括号, ...

  10. 栈的应用-括号匹配的检验

    1.算法描述 在括号匹配算法中定义int flag = 1变量来标记匹配结果是成功还是失败! 利用数据结构栈,从左到右依次扫描字符串:若是遇到左括号入栈:若是遇到右括号:若栈非空,使用Pop(s,to ...

最新文章

  1. 32岁前平凡无奇,鼓动同事创业,最终逆袭成硅谷首富
  2. 【教程】Linux DNS 服务器安装、配置及维护
  3. php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作
  4. JavaScript高级之正则表达式
  5. CoreAnimation编程指南(九)图层布局
  6. java第二章_JAVA第二章知识点
  7. html5文字收起,科技常识:HTML5给汉字加拼音收起展开组件的实现代码
  8. 【大数据部落】混合IBCF协同过滤推荐算法推荐引擎的探索1
  9. 什么是软件测试?进行软件测试的目的是什么?
  10. java pdf转图片
  11. oracle dba 培训教程
  12. 学习笔记-echarts自定义背景图片
  13. 认证 (authentication) 和授权 (authorization) 的区别.md
  14. 从事网络安全,可以考取什么证书?
  15. 打码进行中-JavaScript高级程序设计-第1章-什么是javaScript
  16. windows_server_2008镜像文件
  17. 【练习题】python集合练习
  18. U9 ERP 系统BOM物料清单批量导入导出并新增修改功能
  19. 黑龙江科技大学计算机分数,2017黑龙江科技大学录取分数线
  20. 金融业信贷风控算法5-时间序列模型概述

热门文章

  1. Squid缓存代理服务器
  2. 图注意力网络GRAPH ATTENTION NETWORKS(gat)浅读
  3. kerberos开启kdc的debug日志
  4. 中学数学知识点实体识别
  5. 计算机查询成绩微信公众号,怎么在微信公众号上设置查询成绩?
  6. 微博音视频下载与合并
  7. urllib库如何设置代理如何传递并保存cookie【python爬虫入门进阶】(02-3)
  8. 凯文·凯利又出预言:未来科技将由这四股力量推动!
  9. 零跑股价纳入港股通,是被低估了的新势力
  10. 人大金仓(Kingbase)数据库配置注意事项