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 字典(Dictionary)操作详解
Mar 11 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
单链表反转python实现代码示例
Feb 08 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
Python列表(List)知识点总结
Feb 18 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
解决numpy数组互换两行及赋值的问题
Apr 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中的内存管理问题
2011/08/31 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
php中动态修改ini配置
2014/10/14 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
phpwind放自动注册方法
2006/12/02 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
python实现多进程代码示例
2018/10/31 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
python 进程的几种创建方式详解
2019/08/29 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
详解Python 函数参数的拆解
2020/09/02 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
财务会计专业毕业生自荐信
2013/10/19 职场文书
2015年环卫工作总结
2015/04/28 职场文书
催款函范本大全
2015/06/24 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang