棧的應用之判斷文字括號是否正確
阿新 • • 發佈:2018-11-10
棧的一個經典應用就是判斷一個文字中的括號,包括小括號,中括號,大括號是不是有缺失,順序不正確等情況。
棧的類的實現在前面文章中已經實現,我們這裡直接應用(用的是順序表實現的棧)
兩種解法:第二種解法有細節
第一種解答法如下:
# _*_ coding:utf-8 _*_ """ 用於檢查文字中的括號是不是使用正確, 對於文字中括號的缺少等問題都能夠檢測 """ from 棧的順序表實現 import Stack, StackOverFlow parensK = "([{" parensG = ")]}" parensDict = { ")" : "(", "]" : "[", "}" : "{" } # 建立一個棧的例項 class Solution: stack = Stack() def __init__(self, string): self.string = string def check(self): for char in self.string: ''' 遍歷字串,找出括號字元進行判斷 ''' if char in parensK: self.stack.push(char) elif char in parensG: pchar = self.stack.pop() if parensDict[char] != pchar: raise StackOverFlow("A not match char") if not self.stack.is_empty(): raise StackOverFlow("dont shut it down") string = "({}[()])" solution = Solution(string) solution.check()
第二種解法程式碼如下:
# _*_ coding:utf-8 _*_ """ 一下這個實現方法,利用了棧的儲存原理 但是破壞了棧的操作,可以輸出整個文字中 所有括號的出現順序 """ from 棧的順序表實現 import Stack, StackOverFlow def check_parens(text): """ 括號配對檢查函式,text是被檢查的文字 """ parens = "()[]{}" open_parens = "([{" opposite = { ")" : "(", "]" : "[", "}" : "{" } # 用字典來檢測 def parentheses(text): """ 括號生成器,每次呼叫返回下一次text裡的下一個括號及其位置 使用一個生成器來每次排程都會生成text中的下一個括號 """ i, text_len = 0, len(text) while True: while i < text_len and text[i] not in parens: i += 1 if i >= text_len: return yield text[i], i i += 1 st = Stack() # 儲存括號的棧 for pr, i in parentheses(text): """ 這裡就呼叫了生成器函式 """ if pr in open_parens: st.push(pr) elif st.pop() != opposite[pr]: # 這裡首先執行st.pop(),所以棧頂的元素一定會被刪除 print("Unmatching is found at", i , "for", pr) return False print("All parentheses are correctly matched") return True check_parens("([]{}())")