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来开发Markdown脚本扩展的实例分享
Mar 04 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
Django框架多表查询实例分析
Jul 04 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
Django后台admin的使用详解
Jul 08 Python
python 字符串追加实例
Jul 20 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python argparse模块使用方法解析
Feb 20 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
Python机器学习之逻辑回归
May 11 Python
Django框架模板用法详解
Jun 10 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编实现程动态图像的创建代码
2008/09/28 PHP
PHP中常用的魔术方法
2017/04/28 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
javascript trie前缀树的示例
2018/01/29 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python 功能和特点(新手必学)
2015/12/30 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
OpenCV 模板匹配
2019/07/10 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
执法作风整顿剖析材料
2014/10/11 职场文书
遗嘱格式范本
2015/08/07 职场文书
担保书怎么写 ?
2019/04/22 职场文书
2019财务转正述职报告
2019/06/27 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server