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写的一个文本编辑器
Jan 23 Python
Python标准库urllib2的一些使用细节总结
Mar 16 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
python实现学员管理系统
Feb 26 Python
python字符串循环左移
Mar 08 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
Python 实现微信自动回复的方法
Sep 11 Python
使用tkinter实现三子棋游戏
Feb 25 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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设计模式 Observer(观察者模式)
2011/06/26 PHP
php微信公众平台开发类实例
2015/04/01 PHP
php文件上传的两种实现方法
2016/04/04 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
Django小白教程之Django用户注册与登录
2016/04/22 Python
python:接口间数据传递与调用方法
2018/12/17 Python
详解Python字典的操作
2019/03/04 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
计算机专业学生的自我评价
2013/12/15 职场文书
生物学学生自我评价
2014/01/17 职场文书
设计顾问服务计划书
2014/05/04 职场文书
物流管理专业自荐信
2014/06/23 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
运动会通讯稿200字
2015/07/20 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
Vue的生命周期一起来看看
2022/02/24 Vue.js
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫
浅析Python OpenCV三种滤镜效果
2022/04/11 Python