使用Python實現(xiàn)棧,判斷括號是否平衡

棧(Stack)在計算機領(lǐng)域是一個被廣泛應(yīng)用的集合,棧是線性集合,訪問都嚴格地限制在一段,叫做頂(top)。
舉個例子,棧就想一摞洗干凈的盤子,你每次取一個新盤子,都是放在這一摞盤子的最上頭,當(dāng)你往里面添加盤子的時候,也是放在最上面,處在底部的盤子,你可能永遠也用不到。
棧的最常見操作,有如下兩個:

push(a) # 壓入,將a壓入的棧中
pop() # 彈出,將棧的最后一個元素彈出

可是使用Python的列表數(shù)據(jù)結(jié)構(gòu),來模擬棧的操作,使用append來模擬push,使用列表的pop來模擬棧的pop,但是這樣做有一個弊端,那就是列表原本自帶的操作方法同樣能夠使用,可能會造成混亂。

  • 棧的實現(xiàn)
    下面就通過借助Python的列表,來自定義一個棧類:
class Stack(object):
    """使用數(shù)組實現(xiàn)一個棧"""
    def __init__(self):
        self.data = []

    def push(self, num):
        """壓棧操作"""
        self.data.append(num)

    def pop(self):
        """返回從棧中彈出的元素, 當(dāng)棧為空的時候, 拋出IndexError"""
        return self.data.pop()

    def peek(self):
        """查看當(dāng)前棧頂?shù)脑? 當(dāng)棧為空的時候, 拋出IndexError"""
        return self.data[-1]

    def __len__(self):
        """返回棧的長度, 調(diào)用len(obj)時會自動調(diào)用obj對象的__len__方法"""
        return len(self.data)

    def isEmpty(self):
        """判斷棧是否為空"""
        return True if len(self.data)==0 else False

    def clear(self):
        """清空棧"""
        self.data = []

    def __repr__(self):
        """當(dāng)前對象的表現(xiàn)形式, 在終點直接鍵入對象時會調(diào)用"""
        return 'Stack_' + str(self.data)

    def __str__(self):
        """當(dāng)前對象的字符串表示, 使用print(obj)時會調(diào)用"""
        return 'Stack_' + str(self.data)

以上代碼實現(xiàn)了一個簡單的基于列表的棧。

  • 棧的應(yīng)用
    棧應(yīng)用的一個很典型的例子,就是檢查括號是否匹配。
    例如: 每一個開始的[后面,都應(yīng)該跟著一個位置正確的],并且每一個(后面,也應(yīng)該跟著一個位置正確的結(jié)束的).
  1. (...)...(...)匹配
  2. (...)...(...不匹配
  3. )...((...)不匹配
    像第三個示例中,雖然左右括號的數(shù)量是相等的,但是也是不匹配的,所以不能通過簡單的檢查數(shù)量來實現(xiàn)括號的檢測。
    一種非常有效的解決方式就是使用棧:
  4. 掃描整個字符串, 如果遇到一個開始的括號,將它壓入到棧中
  5. 如果遇到一個結(jié)束的括號,檢查棧頂?shù)脑?,如果是結(jié)束的括號,就將當(dāng)前括號壓入棧中,如果是開始的括號,檢查與當(dāng)前括號是否能配對,不能配對則不匹配
  6. 如果遇到一個結(jié)束的括號,并且當(dāng)前棧為空的話,那么也是不匹配的。
    代碼實現(xiàn)如下:
def isBalance(text):
    """棧的應(yīng)用,檢查括號是否平衡"""
    result_stack = Stack()
    for i in text:
        if i in ['{', '[', '(']:
            result_stack.push(i)
        elif i in ['}', ']', ')']:
            # 遇到結(jié)束括號的情況
            if result_stack.isEmpty():
                # 如果當(dāng)前棧為空, 不匹配,返回False
                return False
            chFromStack = result_stack.pop()
            
            if not ((chFromStack == '{' and i == '}' )
                    or (chFromStack == '[' and i == ']')
                    or (chFromStack == '(' and i == ')')):
                # 如果不滿足匹配條件, 則返回False
                return False

    # 遍歷結(jié)束后, 如果結(jié)果棧為空, 則代表括號匹配, 棧不為空, 括號不匹配
    return result_stack.isEmpty()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,707評論 0 5
  • Unicode?標準附錄#9 UNICODE雙向算法#### 摘要#### 本附件是一份關(guān)于字符定位的規(guī)范,主要描...
    Eriice閱讀 5,189評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評論 19 139
  • 我小時候最喜歡的事就是跑到離我家不遠的鐵路旁去看火車,看著一列列火車從我面前呼嘯而過,我就會有無限的遐想,羨慕他...
    空空空空空如也閱讀 313評論 0 0
  • 文 | 殷中軍(編劇,導(dǎo)演) 導(dǎo)讀: 真愛也許并不是別人眼中完美的匹配,它是一種從內(nèi)心發(fā)出的關(guān)心和照顧,它是心靈的...
    殷中軍閱讀 368評論 0 2

友情鏈接更多精彩內(nèi)容