這篇文章主要介紹了Python實現求解括弧匹配問題的方法,涉及Python基於棧的字串遍曆、判斷、運算解決括弧匹配相關操作技巧,有需要的朋友可以參考下
本文執行個體講述了Python實現求解括弧匹配問題的方法。分享給大家供大家參考,具體如下:
這個在本科學習資料結構的時候已經接觸很多了,主流的思想是藉助棧的壓入、彈出來進行匹配,至於python的話可以使用列表來完成這個操作,因為列表的append
方法相當於棧的push
方法,列表的pop
方法相當於棧的pop
方法。
主要的思路:
首先設定兩個列表分別存放的是各種括弧的開括弧和閉括弧,然後遍曆給定的字串,分如下幾種情況:
1.字串首字元出現在閉括弧列表中,直接結束,輸出錯誤
2.字串長度不為偶數,直接結束,輸出錯誤
3.對原始字串列表化去重,如果去重後的列表長度不為偶數直接結束,輸出錯誤
4.遍曆字串,將屬於開括弧集合的括弧加入到列表中,當遇上一個閉括弧的時候計算該閉括弧在閉括弧列表中的索引與當前列表最後一個開括弧在開括弧列表中的索引是否一致,一致則繼續,否則直接結束,輸出錯誤
主要是在長度很大的時候可以儘快判斷一些比較明顯的錯誤的模式,節省時間,按照這個簡單的思想,下面是具體的實現:
#!usr/bin/env python#encoding:utf-8'''''__Author__:沂水寒城功能:括弧匹配的相關問題'''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 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)
結果如下: