目錄
棧和隊列
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