資料結構與演算法python第九天

Clear chengxi9發表於2020-09-29

棧的應用

簡單括號匹配

  • 類似於這樣的表示式:(5+6)*(7+8)/(4+3)
  • 有些函式語言,如Lisp,在函式定義的時候會用到大量的括號
    比如: (defun square(n)
    (* n n))
    這個語句定義一個計算平方值的函式
  • 括號遵循“平衡”規則
  • 對括號是否正確匹配的識別是很多語言編譯器的基礎演算法

構造括號匹配識別演算法

  • 從左到右掃描括號串,最新開啟的左括號,應該匹配最先遇到的右括號
  • 次序反轉識別,符合棧的特性
    演算法流程圖
from pythonds.basic.stack import Stack

def parChecker(symbolString):
    s = Stack
    balanced = True
    index = 0
    while index < len(symbolString) and balanced:   #索引小於象徵字串並且平衡
        symbol = symbolString[index]        #象就等於字串帶索引
        if symbol == "(":                 #左括號匹配
            s.push(symbol)               #進棧操作
        else:
            if s.isEmpty():            #檢查棧是否為空
                balanced = False       #就沒達到平衡
            else:
                s.pop()                   #刪除
        index = index + 1

    if balanced and s.isEmpty():           #如果平衡而且是空棧
        return True
    else:
        return False

print(parChecker('((()))'))
print(parChecker('(((()))'))

更多括號匹配

  • ()、{}、[],分別是列表、字典、元組和表示式
  • 混合使用,注意開閉
from pythonds.basic.stack import Stack

def parChecker(symbolString):
    s = Stack
    balanced = True
    index = 0
    while index < len(symbolString) and balanced:   #索引小於象徵字串並且平衡
        symbol = symbolString[index]        #象就等於字串帶索引
        if symbol == "([{":                 #左括號匹配
            s.push(symbol)               #進棧操作
        else:
            if s.isEmpty():            #檢查棧是否為空
                balanced = False       #就沒達到平衡
            else:
                s.pop()  #刪除
                if not matches(top, symbol):
                    balanced = False                                     
        index = index + 1

    if balanced and s.isEmpty():           #如果平衡而且是空棧
        return True
    else:
        return False

def matches(open, close):
    opens = "([{"   #matches匹配
    closer = ")]}"
    return opens.index(open) == closers.index(close)


print(parChecker('{{([][])}()}'))
print(parChecker('[{()]'))

通用括號匹配演算法

  • HTML/XML文件有類似於括號的開閉標記,這種層次結構化文件的校驗、操作也可以通過棧來實現
    在這裡插入圖片描述

計算機領域的任何問題都可以通過增加一個間接的中間層來解決

相關文章