題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
思路
棧的壓入順序是指1,2,3,4,5是依次push到棧的,但並不是說只有push的過程,也可能有pop的操作,比如push 1,2,3,4之后,把4pop出去,然后再push5,也是一樣的壓入順序;彈出序列是指每次pop出去的元素都是當時棧頂的元素,比如一開始pop1,2,3,4,然后pop4,再push5,再pop5,然后依次pop3,2,1,那么彈出序列就是4,5,3,2,1;
那么就可以構造一個輔助棧來判斷彈出序列是不是和壓棧序列對應。首先遍歷壓棧序列的元素push到輔助棧,判斷是不是彈出序列的首元素,如果是,則彈出序列pop首元素(指針后移),如果不是,則繼續push,再接着判斷;直到遍歷完了壓棧序列,如果輔助棧或者彈出序列為空,則返回True,否則返回False
解答
class Solution: def IsPopOrder(self, pushV, popV): # write code here stack = [] for i in pushV: stack.append(i) while stack and stack[-1] == popV[0]: stack.pop() popV.pop(0) return True if not stack else False