问题描述:

给定一个字符串文字,里面可能含有"()","[]","{}"三种
括号,判断字符串中的括号是否都成对出现
***

思路分析:

如果括号正确匹配,肯定满足:
1、一对正确匹配的括号,一定先出现左括号,再出现右括号
2、三种括号不会出现交叉现象。如“{【】{}()()}”,而不会出现类似“(【)】”的情况。

如果以人类思维方式取匹配,过程如下:
遇到左括号先暂时不管,遇到右括号再看前面出现的左括号是否匹配。(而且由于括号不会交叉,遇到右括号后,查找的一定是距离最近的一个左括号)

最前面(最先)出现的左括号最后比较,最近出现的左括号先比较。因此,我们可以考虑利用栈“先进后出”的特性。

当遇到一个左括号,让它入栈;遇到一个右括号,则比较栈顶元素是否与之匹配。

首先创建一个Stack类

class Stack:def __init__(self):self.__list = []  # 初始化列表,存储栈中元素。因为不需要外界访问,所以私有化。def push(self, item):  # 弹出栈顶元素self.__list.append(item)def peek(self):return self.__list[len(self.__list) - 1]def pop(self):return self.__list.pop()   # 列表的pop方法,默认返回最后一个元素 def is_empty(self):   # 判断是否栈空return self.__list == []

遇到右括号,如何表示栈顶元素与括号“匹配”呢?*
一种思路是用字典键值对先存储对应的匹配关系

def is_matched_brackets(text):'''判断括号是否匹配:param text: 字符串类型:return:   True --> 全部匹配; False --> 不匹配'''dict_bracket = {')': '(', ']': '[', '}': '{'}   # 用字典的键值对存储匹配关系s = Stack()  # 创建一个栈对象,存储左括号for i in text:if i in dict_bracket.values():  # 左括号入栈 s.push(i)elif i in dict_bracket:  # 遇到右括号if s.is_empty():   # 栈空,说明剩余右括号未匹配print('missing left bracket')return Falseif s.peek() != dict_bracket[i]:  # 如果括号不匹配print('unmatched bracket')return Falses.pop()  # 如果括号匹配则将左括号出栈if not s.is_empty():  # 循环结束。栈中还有元素,说明少右括号print('missing right bracket')return Falsereturn True

以上代码可以初步判断括号是否匹配。但如果想要更加精确的把未匹配的地方告诉用户,我们可以进一步判断未匹配括号的位置及括号的符号

我们只需在上述代码的基础上将左括号的索引位置以及括号一起存储到栈中即可
代码如下:

#  如果需要知道具体哪个位置的括号没有匹配
def is_matched_brackets2(text):dict_bracket = {')': '(', ']': '[', '}': '{'}s = Stack()  # 创建一个栈对象,存储左括号for i in range(len(text)):if text[i] in dict_bracket.values():  # 左括号入栈s.push((i, text[i]))  # 因为最后要记录剩余左括号未匹配的情况,所以索引也要存储elif text[i] in dict_bracket:  # 遇到右括号if s.is_empty() or s.peek()[1] != dict_bracket[text[i]]: # 栈空和缺少对应左括号可以归为一种情况print('unmatched right bracket {} at {}'.format(text[i], i))return Falses.pop()  # 右括号匹配时,将左括号出栈if not s.is_empty():index, item = s.pop()print('unmatched left bracket {} at {}'.format(item, index))return Falsereturn True

在此次练习中,我有几个细节方面的问题,总结如下:
1、if i in dict_bracket.values():
第一次忘记写values后面的括号,报错为:
TypeError: argument of type ‘builtin_function_or_method’ is not iterable*

>>> dict_ = {1:'a',2:'b'}
>>> dict_.values
<built-in method values of dict object at 0x0000028ECFC9F500>
>>> type(dict_.values)
<class 'builtin_function_or_method'>

调用内置方法,需要加括号

2、

if text[i] in dict_bracket.values:  # 遇到左括号入栈s.push((i, text[i]))

因为push函数的本质是调用列表的append()方法(见上文),所以传入的对象应该是一个整体。 s.push((i, text[i])) 内层括号将索引与括号符号一一个元组形式传递。

3、

if s.peek() != dict_bracket[i]:  # 如果括号不匹配print('unmatched bracket')

这个地方只能用peek()判断—查看栈顶元素,
不能用pop()— 弹出栈顶元素
否则括号不匹配,栈顶元素也被取出来

4、

 if s.is_empty() or s.peek()[1] != dict_bracket[text[i]]:# [1]表示对栈中元素(元组类型)索引,返回括号符号index, item = s.pop()
# 左边逗号分隔,python自动生成元组

5、第一次尝试用if判断时

    for i in text:if i is '(':  # 左括号入栈s.push(i)

报错为:
SyntaxWarning: “is” with a literal. Did you mean “==”?

is 是身份运算符,本质是通过id()函数比较的。我进行了以下尝试:

a = '(df'
for i in a:print(i is '(')

运行结果:True False False
也就是说,a[0] is ‘(’ 这个判断是没有问题的
这个问题是我所感到疑惑,尚未解决的。

python用栈实现括号匹配问题相关推荐

  1. python括号匹配o(1)复杂度_Python面试题:使用栈处理括号匹配问题

    括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...

  2. python括号匹配算法_使用Python的栈实现括号匹配算法

    利用Python列表实现一个栈的结构,再使用栈实现括号匹配的算法,所谓的括号匹配是指在编程语言中,括号是成对出现的,最先出现的左括号,对应于最后的右括号,后出现的左括号对应于最新右括号,符合栈的特征 ...

  3. 利用顺序栈解决括号匹配问题(c++)-- 数据结构

    利用顺序栈解决括号匹配问题(c++)-- 数据结构 参考文章: (1)利用顺序栈解决括号匹配问题(c++)-- 数据结构 (2)https://www.cnblogs.com/yi2105/p/106 ...

  4. C++ 栈的括号匹配

    总结归纳 算法思想: 设置一个空栈,顺序读取括号.读取左括号时,将括号入栈:读取右括号时,弹出栈顶元素,栈顶即是与之匹配的最近的左括号. 匹配不成功的三种情况:(1)读取右括号时,此时栈空,没有与之匹 ...

  5. python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...

    算法 数据结构 数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题 在平时写程序当中,我们会经常遇到程序当中括号的匹配问题,也就是在程序当中左括号的数量和右括号的数量必须相等.如 ...

  6. 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

    括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...

  7. 【Python】最长括号匹配问题:给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串

    最长括号匹配 示例: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长匹配的括号子串. 算法分析 只有在右括号和左括号发生匹配时,才有可能更新最终解. 计算s[0 ...

  8. python括号配对问题_使用Python的栈实现括号匹配算法

    写一个栈的类:stack.py class Stack: def __init__(self): self.items = [] def is_Empty(self): return self.ite ...

  9. 六十三、栈在括号匹配和表达式求值中的应用

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 算法,一门既不容易入门,也不容易精通的学问. 文章目录 括号匹配 数 ...

最新文章

  1. mysql error number 1130,[转]mysql error number 1130的解决方法
  2. python 自动填充表单,如何在Django / Python中自动填充PDF表单?
  3. golang经典书籍--Go语言实战
  4. OpenStack 认证服务 KeyStone部署 (四)
  5. CentOS7卸载并安装mysql教程
  6. oracle数据库连接名是什么,连接到Oracle数据库的几种命名方式
  7. 一个值得收藏的小工具
  8. 高德车道级导航已上线8城 新增支持小米11 Pro
  9. python学习笔记(二十七)多线程与多进程
  10. Oracle 创建表空间借鉴 保留,占版权留言告知
  11. unity读取json文件以及反序列化Dic示例
  12. Linux下 TP(触摸屏)驱动的框架分析
  13. Django项目部署以及nginx配置
  14. C# ILDASM 使用
  15. VMware Workstation Server 服务器启动报1075错误
  16. php微信问卷调查,We_Questionnaire: !!停止维护!!基于Thinkphp3.2.3 + jqueryMobile1.4.4的微信公众号应用 -- 移动端问卷调查...
  17. 计算机网络英语的参考文献,计算机网络实践英文参考文献 计算机网络实践英语参考文献哪里找...
  18. Grafana dashboard 定时报表(Grafana-reporter)
  19. java poc_spring系列cve poc编写
  20. 深入理解 OC/C++ 闭包

热门文章

  1. c语言函数助手使用,C语言函数助手怎么查询函数?
  2. 开启电竞旗舰新纪元,拯救者电竞手机2 Pro仅3699元起
  3. 一人之下手游当前服务器注册已满,一人之下手游不能注册是怎么回事 一人之下手游不能注册原因详情...
  4. ShaderGraph——流光
  5. C语言,宏的字符串化
  6. 第九届“中兴·图灵杯”人工智能程序设计大赛圆满落幕
  7. 骑士游历数组任意起点c语言,DFS(二):骑士游历问题
  8. php劳保管理系统,劳保用品管理信息系统软件
  9. CSS:font-family常用字体中英文对照
  10. 销售找客户,客户陌拜的几个实用小技巧