python-數據結構-棧-括號匹配

括號匹配

   從空棧開始,從左到右處理括號字符串。如果一個符號是一個開始符號,將其作爲一個信號,對應的結束符號稍後會出現。另一方面,如果符號是結束符號,彈出棧,只要彈出棧的開始符號可以匹配每個結束符號,則括號保持匹配狀態。如果任何時候棧上沒有出現符合開始符號的結束符號,則字符串不匹配。最後,當所有符號都被處理後,棧應該是空的。

    在 Python 中,方括號 [ 和 ] 用於列表,花括號 { 和 } 用於字典。括號 ( 和 ) 用於元祖和算術表達式。只要每個符號都能保持自己的開始和結束關係,就可以混合符號。。符號字符串如

{ { ( [ ] [ ] ) } ( ) }

[ [ { { ( ( ) ) } } ] ]

這些被恰當的匹配了,因爲不僅每個開始符號都有對應的結束符號,而且符號的類型也匹配。相反這些字符串沒法匹配:

( [ ) ]

[ { ( ) ]

from python_basic_stack.stack_definition import Stack


def matches(open, close):
    # top symbol
    opens = "([{"
    closers = ")]}"
    # 對比下標位置是否相同
    return opens.index(open) == closers.index(close)


# 定義一個符號匹配函數
def symbolmatch(symbolString):

    # 初始化一個棧
    s = Stack()

    balanced = True
    # 初始下標
    index = 0

    # 遍歷symbolString  {{([][])}()}   [{()]
    while index < len(symbolString) and balanced:

        symbol = symbolString[index]

        if symbol in "([{":
            s.push(symbol)
        else:
            print(s.list1())
            if s.isEmpty():
                balanced = False
            else:
                # 輸出棧頂
                top=s.peek()
                print(top)
                s.pop()
                if not matches(top, symbol):
                    balanced = False
        index += 1

    if balanced and s.isEmpty():
        return True
    else:
        return False


print(symbolmatch('{{([][])}()}'))
print(symbolmatch('[{()]'))
發佈了87 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章