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 相关文章推荐
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
python实现rsa加密实例详解
Jul 19 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
python实现最速下降法
Mar 24 Python
python/golang实现循环链表的示例代码
Sep 14 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
Python中异常处理用法
Nov 27 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+DBM的同学录程序(5)
2006/10/09 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
跟老齐学Python之开始真正编程
2014/09/12 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
Django models文件模型变更错误解决
2020/05/11 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
党员批评与自我批评范文
2014/09/23 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
欢送会主持词
2015/07/01 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
《小小的船》教学反思
2016/02/18 职场文书
《绝招》教学反思
2016/02/20 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android