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中 ? : 三元表达式的使用介绍
Oct 09 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
Python实现的多线程http压力测试代码
Feb 08 Python
使用Turtle画正螺旋线的方法
Sep 22 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
python+requests实现接口测试的完整步骤
Oct 27 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
Python编写冷笑话生成器
Apr 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
定义php常量的详解
2013/06/09 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
php汉字转拼音的示例
2014/02/27 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
php中yii框架实例用法
2020/12/22 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
Python微信操控itchat的方法
2019/05/31 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
上课玩手机检讨书
2014/02/08 职场文书
干部下基层实施方案
2014/03/14 职场文书
职称评定自我鉴定
2014/03/18 职场文书
整改报告怎么写
2014/11/06 职场文书
铁路安全反思材料
2014/12/24 职场文书
放飞理想主题班会
2015/08/14 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
总结Python变量的相关知识
2021/06/28 Python
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
Python中npy和mat文件的保存与读取
2022/04/24 Python
nginx配置限速限流基于内置模块
2022/05/02 Servers