每日題。今天是stack連續第四天出現。

題目

模擬一個stack,數列pushed為押入的順序,檢查有沒有辦法實現popped的順序彈出元素。

pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
st = [1]
st = [1,2]
st = [1,2,3]
st = [1,2,3,4] pop4
st = [1,2,3]
st = [1,2,3,5] pop5
st = [1,2,3] pop3
st = [1,2] pop2
st = [1] pop1
st = [] 回傳true

解法

照著stack的運作方式模擬。
維護堆疊st和變數i,j分別指向push和pop陣列,如果st為空或是頂端元素不為下個想要的pop值,則不斷壓入新的元素;若可壓入元素中途用完則代表不可能完成。

class Solution:
    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        st=[]
        N=len(pushed)
        i=j=0
        while j<N:
            if not st or st[-1]!=popped[j]:
                if i<N:
                    st.append(pushed[i])
                    i+=1
                else:
                    return False
            else:
                st.pop()
                j+=1

        return True

討論區大神直接拿pushed陣列當作stack,不需要額外空間的解法。
i為stack寫入頭,j為下個要求的彈出元素索引,每次彈出則i往回、j向後走。最後i回到原本位置代表stack中沒有剩餘,回傳true。

class Solution:
    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        N=len(pushed)
        i=j=0
        for n in pushed:
            pushed[i]=n
            while i>=0 and pushed[i]==popped[j]:
                i-=1
                j+=1
                
            i+=1
        return i==0