题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路题解
借助一个辅助栈,首先通过遍历压栈顺序将第一个元素放入栈中,然后判断栈顶元素是不是出栈序列中的第一个元素,若是,出栈第一个元素,同时将出栈顺序向后移一位,出栈序列该元素弹出,直到不相等;若不是,将压栈序列中的元素继续压入栈中,直到栈顶元素与出栈序列中的元素相等;这样循环等压栈顺序遍历完成后,辅助栈还不为空,说明弹出序列不是该栈的弹出序列。
举例
入栈:1,2,3,4,5
出栈:4,3,5,1,2
入栈序列1进栈,入栈序列1不等于出栈序列4,入栈序列2进栈;
入栈序列2不等于4,3进栈;
入栈序列3不等于4,4进栈;
入栈序列4等于4,出栈4;
入栈序列3等于3,3出栈;
入栈序列2不等于5,5进栈;
入栈序列5等于5,5出栈;
此时栈中有1,2(栈顶元素),出栈序列中的1并不等于栈顶元素2,故不能出栈。栈中元素非空,此出栈序列不是入栈序列的弹出序列。
代码实现
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
stack=[] #借助中间栈判断
while(popV):
#入栈序和出栈序中第一个元素相同,相当于该元素入栈后便出栈
#直接对pushV和popV做弹出操作,弹出该元素。
if pushV and pushV[0]==popV[0]:
pushV.pop(0)
popV.pop(0)
#如果栈不为空,且栈中栈顶元素与出栈序中的元素相同,则弹出
elif stack and stack[-1]==popV[0]:
stack.pop()
popV.pop(0)
#若栈中栈顶元素并且入栈序列的第一个元素不与出栈序列第一个元素相同
#则将不空的入栈序列元素进栈,重复以上判断
elif pushV:
stack.append(pushV.pop(0))
#如若最后都压入元素为空(全部入栈),
#弹出序第一个元素仍不与栈顶元素相同,则证明该弹出序列不是该压入序列的弹出序列。
else:
return False
return True