劍指offer——python【第21題】棧的壓入、彈出序列


 題目描述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM