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 random模块(获取随机数)常用方法和使用例子
May 13 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
requests和lxml实现爬虫的方法
Jun 11 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
3分钟学会一个Python小技巧
Nov 23 Python
对python for 文件指定行读写操作详解
Dec 29 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
20行Python代码实现视频字符化功能
Apr 13 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
PyQt5爬取12306车票信息程序的实现
May 14 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
第七章 php自定义函数实现代码
2011/12/30 PHP
php的一个简单加密解密代码
2014/01/14 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
python实现网页链接提取的方法分享
2014/02/25 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python中的日期时间处理详解
2016/11/17 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
旅游管理毕业生自荐信
2013/11/05 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
JavaScript实例 ODO List分析
2022/01/22 Javascript