Python实现的括号匹配判断功能示例


Posted in Python onAugust 25, 2018

本文实例讲述了Python实现的括号匹配判断功能。分享给大家供大家参考,具体如下:

1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n)

# -*- coding: utf8 -*-
# 符号表
SYMBOLS = {'}': '{', ']': '[', ')': '(', '>': '<'}
SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), SYMBOLS.keys()
def check(s):
 arr = []
 for c in s:
  if c in SYMBOLS_L:
   # 左符号入栈
   arr.append(c)
  elif c in SYMBOLS_R:
   # 右符号要么出栈,要么匹配失败
   if arr and arr[-1] == SYMBOLS[c]:
    arr.pop()
   else:
    return False
 return True
print(check("3 * {3 +[(2 -3) * (4+5)]}"))
print(check("3 * {3+ [4 - 6}]"))

运行结果:

True
False

2.

# -*- coding: utf8 -*-
# 存储左括号和右括号
open_brackets = '([{<'
close_brackets = ')]}>'
# 映射左右括号便于出栈判断
brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}
# 对于每一行数据,进行如下判定若括号为左括号,加入栈,若括号为右括号,判断是否跟栈尾括号对应,
# 若对应,弹出栈尾元素,若所有括号均正确闭合,则最后栈为空。
rows = [
'([<^>x[ ]{a}]{/}{t}g<^>)<{x}b>{x}<z({%}w >[b][c[c]]{<h>{h}}',
 '[/]{((x)({{*}*}w)w){f}{v}[%(^[z]{u}{ })([[ ]-]h)]{c}(*)[y]}',
 '<<(^)z>>[b]< >[[(c)u[v]{z<b< >><b>}]g][/b[(])v(v)(+)](v)',
 '[[b]][(v)g]<z>([{{<->+}e}[*]d<+>]g[[a] <+>(v){b}<e>]){a}[u]']
for row in rows:
 stack = []
 label = True
 for char in row:
  if char in open_brackets:
   stack.append(char)
  elif char in close_brackets:
   if len(stack) < 1:
    label = False
    break
   elif brackets_map[char] == stack[-1]:
    stack.pop()
   else:
    label = False
    break
  else:
   continue
 if stack != []:
  label = False
 print(label)

运行结果:

False
True
False
True

3.

在长度很大的时候可以尽快判断一些比较明显的错误的模式,节省时间:

主要的思路:

首先设置两个列表分别存放的是各种括号的开括号和闭括号,然后遍历给定的字符串,分如下几种情况:

  1. 字符串 首字符 出现在闭括号列表中,直接结束,输出错误
  2. 字符串长度不为偶数,直接结束,输出错误
  3. 对原始字符串列表化去重,如果去重后的列表长度不为偶数直接结束,输出错误
  4. 遍历字符串,将属于开括号集合的括号加入到列表中,当遇上一个闭括号的时候计算该闭括号在闭括号列表中的索引与当前列表最后一个开括号在开括号列表中的索引是否一致,一致则继续,否则直接结束,输出错误
#!usr/bin/env python
# encoding:utf-8
def bracket_mathch(one_str):
 '''''
 括号匹配
 '''
 tmp_list = []
 open_bracket_list = ['(', '[', '{', '<', '《']
 close_bracket_list = [')', ']', '}', '>', '》']
 one_str_list = list(one_str)
 length = len(one_str_list)
 set_list = list(set(one_str_list))
 num_list = [one_str_list.count(one) for one in set_list]
 if one_str[0] in close_bracket_list:
  return False
 elif length % 2 != 0:
  return False
 elif len(set_list) % 2 != 0:
  return False
 else:
  for i in range(length):
   if one_str[i] in open_bracket_list:
    tmp_list.append(one_str[i])
   elif one_str[i] in close_bracket_list:
    if close_bracket_list.index(one_str[i]) == open_bracket_list.index(tmp_list[-1]):
     tmp_list.pop()
    else:
     return False
     break
 return True
if __name__ == '__main__':
 one_str_list = ['({})', '({[<《》>]})', '[(]){}', '{{{{{{', '([{}])', '}{[()]']
 for one_str in one_str_list:
  if bracket_mathch(one_str):
   print(one_str, '正确')
  else:
   print(one_str, '错误')
 tmp = '{}[{()()[]<{{[[[[(())()()(){}[]{}[]()<>]]]]}}>}]'
 print(bracket_mathch(tmp))

运行结果:

('({})', '\xe6\xad\xa3\xe7\xa1\xae')
('({[<\xe3\x80\x8a\xe3\x80\x8b>]})', '\xe6\xad\xa3\xe7\xa1\xae')
('[(]){}', '\xe9\x94\x99\xe8\xaf\xaf')
('{{{{{{', '\xe9\x94\x99\xe8\xaf\xaf')
('([{}])', '\xe6\xad\xa3\xe7\xa1\xae')
('}{[()]', '\xe9\x94\x99\xe8\xaf\xaf')
True

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
决策树的python实现方法
Nov 18 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
Python的gevent框架的入门教程
Apr 29 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
Python实现购物系统(示例讲解)
Sep 13 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
最小二乘法及其python实现详解
Feb 24 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Python根据字符串调用函数过程解析
Nov 05 Python
python 基于opencv操作摄像头
Dec 24 Python
Django中使用Celery的教程详解
Aug 24 #Python
python tornado微信开发入门代码
Aug 24 #Python
python使用rpc框架gRPC的方法
Aug 24 #Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 #Python
python中文编码与json中文输出问题详解
Aug 24 #Python
详解Django解决ajax跨域访问问题
Aug 24 #Python
Python面向对象之反射/自省机制实例分析
Aug 24 #Python
You might like
PHP写的资源下载防盗链类分享
2014/05/12 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python实现栈的方法
2015/05/26 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python中动态创建类实例的方法
2017/03/24 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python面试题小结附答案实例代码
2019/04/11 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
网管求职信
2014/03/03 职场文书
违章停车检讨书
2014/10/21 职场文书
检讨书范文500字
2015/01/28 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
Java设计模式之代理模式
2022/04/22 Java/Android
TypeScript 内置高级类型编程示例
2022/09/23 Javascript