棧的應用之括號匹配

2021-08-30 04:37:09 字數 1168 閱讀 9198

在許多正文中都有括號,特別是在表示程式、數學表示式的正文片段裡,括號有正確配對問題。作為例子,下面考慮python程式裡的括號,在這裡可以看到:

不難總結出檢查括號配對的原則:在掃瞄正文過程中,遇到的閉括號應該與此前最近遇到且尚未獲得匹配的開括號配對。如果最近的未匹配開括號與當前閉括號不配對,或者找不到這樣的開括號,就是匹配失敗,說明這段正文裡的括號不配對。

由於存在多種不同的括號對,每種括號都可能出現任意多次,而且還可能巢狀。為了檢查是否匹配,掃瞄中必須儲存遇到的開括號。由於寫程式時無法預知要處理的正文裡會有多少括號需要儲存,因此不能用固定數目的變數儲存,必須用快取結構。

由於括號的出現可能巢狀,需要逐對匹配:當前閉括號應該與前面最近的尚未配對的開括號匹配,下乙個閉括號應與前面次近的括號匹配。這說明,需要儲存的開括號的使用原則是後存人者先使用,符合lifo原則。

進而,如果乙個開括號已配對,就應該刪除這個括號,為隨後的匹配做好準備。顯然,在掃瞄中,後遇到並儲存的開括號將先配對並被刪除,這就是按出現的順序後進先出。這些情況說明,用棧儲存遇到的開括號可以正確支援匹配工作。

通過上面分析,處理這個問題的脈絡已經很清楚了:

def check_parens(text):

"""括號配對檢查函式,text是被檢查的正文串"""

parens="(){}" #要檢查配對的所有括號

open_parens="([":" #表示配對關係的字典

def parentheses(text):

"""括號生成器,每次呼叫返回text裡的下一括號及其位置"""

i,text_len=0,len(text)

while true:

while i=text_len:

return

yield text[i],i

i+=1

st=sstack() #棧

for p,i in parentheses(text):

if p in open_parens:

st.push(p)

else:

if opposite[p]!=st.pop():

print("\n匹配失敗")

return false

print("\n匹配成功")

return true

棧的應用之括號匹配

給定乙個只包括 的字串 s 判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。將左括號進棧,當遇到右括號時與棧頂元素進行括號匹配,左右括號不匹配或者棧為空時退出,匹配則彈出棧頂元素,最後判斷棧是否為空,為空則說明所有的括號都匹配了,反之則存在不匹配的括號...

棧的應用之括號匹配檢驗

棧結構具有後進先出的固有特性,在程式設計中很有幫助。這裡舉乙個例子,將棧應用與括號匹配的檢驗。假設表示式中允許三種括號 小括號 中括號和大括號,巢狀的順序任意。等均為正確格式。檢驗括號是否匹配可用 期待的急迫程度 來描述。接收乙個正括號後,計算機期待著乙個與之匹配的反括號。如果此時接收到乙個反括號,...

棧的簡單應用之括號匹配

include include include define emptytos 1 define minstacksize 5 typedef char elementtype struct stackrecord typedef struct stackrecord stack int isemp...