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 splitlines使用技巧
Sep 06 Python
python实现目录树生成示例
Mar 28 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
Python编程实现蚁群算法详解
Nov 13 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
查看django版本的方法分享
May 14 Python
python3将视频流保存为本地视频文件
Jun 20 Python
python 阶乘累加和的实例
Feb 01 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
Python系统公网私网流量监控实现流程
Nov 23 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
小程序自定义圆形进度条
2020/11/17 Javascript
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
python配置grpc环境
2019/01/01 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
使用django自带的user做外键的方法
2020/11/30 Python
介绍一下Make? 为什么使用make
2013/12/08 面试题
物理系毕业生自荐信
2013/11/01 职场文书
九年级家长会邀请函
2014/01/15 职场文书
技能比赛获奖感言
2014/02/14 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
美术指导求职信
2014/03/17 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
升职自我推荐信范文
2015/03/25 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL