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正则表达式re模块详细介绍
May 29 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
django之常用命令详解
Jun 30 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
Python正则表达式和元字符详解
Nov 29 Python
python调试神器PySnooper的使用
Jul 03 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
Jun 04 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python代码需要缩进吗
Jul 01 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
python绘图模块之利用turtle画图
Feb 12 Python
yolov5返回坐标的方法实例
Mar 17 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中的超全局变量
2006/10/09 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
python模糊图片过滤的方法
2018/12/14 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
工业设计专业推荐信
2013/10/29 职场文书
应用英语专业自荐信
2014/01/26 职场文书
车辆工程专业求职信
2014/04/28 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2014年教师节活动总结
2014/08/29 职场文书
2015员工年度考核评语
2015/03/25 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
python实现手机推送 代码也就10行左右
2022/04/12 Python