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调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
详解Python用户登录接口的方法
Apr 17 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
wxPython实现文本框基础组件
Nov 18 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
用python实现学生管理系统
Jul 24 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
scrapy处理python爬虫调度详解
Nov 23 Python
python pygame入门教程
Jun 01 Python
Python 语言实现六大查找算法
Jun 30 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
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP防止跨域提交表单
2013/11/01 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python插入排序算法实例分析
2015/07/03 Python
深入理解Python中的super()方法
2017/11/20 Python
python 动态加载的实现方法
2017/12/22 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
python命令行工具Click快速掌握
2019/07/04 Python
django如何自己创建一个中间件
2019/07/24 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
总裁办公室主任职责
2014/01/02 职场文书
物流仓管员工作职责
2014/01/06 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书