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}]"))

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-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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM