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中的继承和多态的概念
Apr 27 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
Tornado 多进程实现分析详解
Jan 12 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python continue继续循环用法总结
Jun 10 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
哪些是python中web开发框架
Jun 17 Python
django haystack实现全文检索的示例代码
Jun 24 Python
python状态机transitions库详解
Jun 02 Python
聊聊Python String型列表求最值的问题
Jan 18 Python
PyTorch中的torch.cat简单介绍
Mar 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生成xml简单实例代码
2009/12/16 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
python-str,list,set间的转换实例
2018/06/27 Python
python Tensor和Array对比分析
2020/01/08 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python 读取位于包中的数据文件
2020/08/07 Python
python 如何调用远程接口
2020/09/11 Python
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
体育部部长竞选稿
2015/11/21 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
python通过函数名调用函数的几种方法总结
2021/06/07 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server