国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現括號匹配方法詳解

2020-02-15 21:17:39
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了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 Trueprint(check("3 * {3 +[(2 -3) * (4+5)]}"))print(check("3 * {3+ [4 - 6}]"))

2.

# 存儲左括號和右括號open_brackets = '([{<'close_brackets = ')]}>'# 映射左右括號便于出棧判斷brackets_map = {')': '(', ']': '[', '}': '{', '>': '<'}# 對于每一行數據,進行如下判定若括號為左括號,加入棧,若括號為右括號,判斷是否跟棧尾括號對應, 若對應,彈出棧尾元素,若所有括號均正確閉合,則最后棧為空。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)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]']

3.

在長度很大的時候可以盡快判斷一些比較明顯的錯誤的模式,節省時間:

主要的思路:

首先設置兩個列表分別存放的是各種括號的開括號和閉括號,然后遍歷給定的字符串,分如下幾種情況:

1.字符串 首字符 出現在閉括號列表中,直接結束,輸出錯誤

2.字符串長度不為偶數,直接結束,輸出錯誤

3.對原始字符串列表化去重,如果去重后的列表長度不為偶數直接結束,輸出錯誤

4.遍歷字符串,將屬于開括號集合的括號加入到列表中,當遇上一個閉括號的時候計算該閉括號在閉括號列表中的索引與
當前列表最后一個開括號在開括號列表中的索引是否一致,一致則繼續,否則直接結束,輸出錯誤

#!usr/bin/env python# encoding:utf-8def 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 Trueif __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))            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白水县| 竹山县| 天镇县| 东港市| 南投市| 高阳县| 乐昌市| 平顶山市| 大埔县| 阜宁县| 三门县| 邵武市| 镇江市| 黎城县| 杂多县| 阿坝县| 福泉市| 安多县| 井研县| 孝昌县| 榆树市| 化州市| 图木舒克市| 洛阳市| 广河县| 五台县| 都兰县| 邻水| 池州市| 烟台市| 讷河市| 霸州市| 铁岭市| 环江| 金川县| 中宁县| 合作市| 金川县| 青神县| 云和县| 青岛市|