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 专题四 文件基础知识
Mar 20 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Django数据库表反向生成实例解析
Feb 06 Python
python实现AES加密与解密
Mar 28 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
基于python实现删除指定文件类型
Jul 21 Python
python文件路径操作方法总结
Dec 21 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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解答方法
2012/02/04 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
跟老齐学Python之模块的加载
2014/10/24 Python
Python 类的继承实例详解
2017/03/25 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
为什么要使用servlet
2016/01/17 面试题
护理专科自荐书范文
2014/02/18 职场文书
学校元旦晚会方案
2014/02/19 职场文书
颁奖典礼主持词
2014/03/25 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
2014年保育员工作总结
2014/12/02 职场文书
邀请函格式范文
2015/02/02 职场文书
毕业欢送会致辞
2015/07/29 职场文书
升学宴学生致辞
2015/09/29 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
Python实现仓库管理系统
2022/05/30 Python
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers