數據結構和算法(Python版):利用棧(Stack)實現括號的匹配問題

在平時寫程序當中,咱們會常常遇到程序當中括號的匹配問題,也就是在程序當中左括號的數量和右括號的數量必須相等。若是不相等的話則程序必然會報錯。Hint:在讀取程序的時候,讀取的結果確定是左邊的全是左括號,右邊的全是右括號,也就是必定是「(((( )))))」或者「((((((((((((( )))))))))))))))))」的形式,不多是左右括號互相交互的形式,好比這種:「()()()()))((())((」, 編寫過程序的同窗就可以很輕鬆的知道這是爲何,由於先有左後有右,正好這個特性和棧的特性相符合,所以咱們使用棧來解決這個問題,首先定義一個棧的類class:算法

class Stack():

    def __init__(self):
        # 初始化一個空的列表
        self.__list=[]

        # 壓棧,也就是把元素從上方添加上去,可是這裏我咋感受是從下方添加進去的,順序反了?
    def push(self,item):
        self.__list.append(item)

    def pop(self):
        return self.__list.pop()# 彈出棧頂的元素,同時刪除棧頂的元素

    # 返回棧頂的元素
    def peek(self):
        return self.__list[len(self.__list)-1]# 也就是獲取列表當中的最後一個元素

    # 判斷棧是否爲空
    def is_empty(self):
        return self.__list == []

    # 計算棧的大小
    def size(self):
        return len(self.__list)

    #返回當前棧的列表
    def what(self):
        return self.__list

這也是棧最多見的定義,已經約定俗成了。如今則是算法的實現過程,咱們能夠用程序首先讀取括號,好比已經給定了括號的字符串「((((( )))))」,咱們將這個字符串傳入進行括號匹配的函數當中。若是在循環讀取括號當中,讀取到了左括號,那麼就進行入棧操做。以後左括號讀取完畢,再進行右括號的讀取操做,每讀取到一次右括號,則進行出棧操做,也就是將以前進棧的左括號刪除。若是左括號比右括號多,那麼棧不管如何也沒法爲空,則括號不匹配,返回false。若是右括號比左括號更多,那麼棧若是已經爲空,程序還在讀取右括號,說明右括號比左括號更多,這樣程序則也返回false。在左括號和右括號的數量相等的時候,程序返回True,思路就是這樣的,所以程序的代碼以下:app

def pipei(string):
    stack = Stack()
    i=0
    while i<len(string):
        if string[i]=="(":
            stack.push(string[i])
        elif string[i]==")":
            if stack.is_empty():
                return False
            elif not stack.is_empty():
                stack.pop()
        i=i+1
    if  stack.is_empty():
        return True
    else:
        return False


print("開始括號的匹配問題:")
print(pipei("(((())))"))
print(pipei("(((()))))))))))"))

輸出爲:函數

開始括號的匹配問題
True
False

那麼真實的程序還須要咱們本身寫一個讀取程序的文件,讓咱們過濾掉其餘符號,只提取出保留括號的字符串,咱們這裏再寫一個函數類實現這個功能:spa

def tiqukuohao(string):
    i=0
    ls=[]
    while i<len(string):
        if string[i]=="(":
            ls.append(string[i])
        elif string[i]==")":
            ls.append(string[i])
        else:
            pass
        i=i+1

    new_string="".join(ls)#將拿到的列表變成字符串,十分常規的操做
    return new_string

而後調用函數,將一個括號匹配的放入函數,和另外一個括號不匹配的字符串放入函數:code

print(pipei(tiqukuohao("(sdvcsadc(asdasd(a)sdfsdf)asd)asdfas")))
print(pipei(tiqukuohao("sdvcsadc(asdasd(a)sdfsdf)asd)asdfas")))

最後輸出爲:blog

True
False

得解!ip

相關文章
相關標籤/搜索