《劍指Offer》——棧和隊列(Python3 實現)

目錄

棧和隊列

1、用兩個棧實現隊列

2、棧的壓入彈出序列


棧和隊列

1、用兩個棧實現隊列

問題:用兩個棧實現一個隊列,完成隊列的Push和Pop操作。隊列中的元素爲int類型。

思路:使用兩個棧stack,stack1用來進棧,stack2是爲了出棧時讓stack1的所有元素先pop到stack2中,這樣方便讓隊列的最頂端元素最先出來,即從stack2中pop出的第一個元素;pop出來之後恢復原來的stack1,將stack2中的元素依次pop到stack1中。

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        self.stack1.append(node)
    def pop(self):
        while self.stack1:
            self.stack2.append(self.stack1.pop())
        res=self.stack2.pop()
        while self.stack2:
            self.stack1.append(self.stack2.pop())
        return res

2、棧的壓入彈出序列

問題:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

思路:借⽤⼀個輔助的棧,遍歷壓棧順序,先將第⼀個放⼊棧中,這⾥是1,然後判斷棧頂元素是不是出棧順序的第⼀個元素,這⾥是4,很顯然1≠4,所以我們繼續壓棧,直到相等以後開始出棧,出棧⼀個元素,則將出棧順序向後移動⼀位,直到不相等,這樣循環,等壓棧順序遍歷完成,如果輔助棧還不爲空,說明彈出序列不是該棧的彈出順序。

舉例入棧1,2,3,4,5出棧4,5,3,2,1首先1入輔助棧,此時棧頂1≠4繼續入棧2,此時棧頂2≠4繼續入棧3,此時棧頂3≠4,繼續入棧4,此時棧頂4=4彈出序列向後一位,此時爲5輔助棧裏面是1,2,3,此時棧頂3≠5,繼續入棧5(注意:出棧後要對出棧變化後的棧用while循環保證此時棧頂層第一個節點先跟後續序列進行比較,再壓入新的元素),此時棧頂5=5,出棧5,彈出序列向後一位,此時爲3,輔助棧裏面是1,2,3……依次執行,最後輔助棧爲空。如果不爲空說明彈出序列不是該棧的彈出順序

# -*- coding:utf-8 -*-
class Solution:
    def IsPopOrder(self,pushV,popV):
        stack=[]
        if not pushV or not popV:
            return False
        for i in pushV:
            stack.append(i)
            while stack and stack[-1]==popV[0]:
                stack.pop()
                popV.pop(0)
        if stack:
            return False
        return True

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章