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 k-近邻算法实例分享
Jun 11 Python
Python爬取读者并制作成PDF
Mar 10 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Python进程Multiprocessing模块原理解析
Feb 28 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笔试题
2009/08/04 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
详解php反序列化
2020/06/10 PHP
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
python发送邮件实例分享
2017/07/28 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python如何重载模块实例解析
2018/01/25 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
python实现无边框进度条的实例代码
2020/12/30 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
Internet体系结构
2014/12/21 面试题
个人现实表现材料
2014/02/04 职场文书
节约用水演讲稿
2014/05/21 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
学历证明范文
2015/06/16 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
如何用Navicat操作MySQL
2021/05/12 MySQL
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis