题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:
- 构建一个辅助栈 stack 按照push顺序依次来对比pop序列的元素.
- 若栈不为空且栈顶元素等于pop序列的元素, 那么进行下一轮迭代,比对下一个pop序列的元素 .
- 当前对比元素不相等时: 将push序列的元素压入stack .
- 当元素相等时,(等于压入stack的push元素再弹出,没有影响), 比对下一个pop序列的元素 .
整体是对三个栈来操作 :
对于pop序列来说, 我们只需要对于进行index的从前往后遍历和对比. 同时对比stack 和 push序列.
对于push序列来说, 我们需要对其不断的压入辅助栈stack,同时元素是进行的pop( ), 当push为空了, 是判断循环结束的条件. 元素都已经压入辅助栈了,但是辅助栈的栈顶元素跟pop序列的栈顶元素不一致, 直接判断为False.
对于辅助栈来说, 一是需要栈顶跟pop元素比较; 二是需要不断的将push的元素压入, 压入的条件是push和pop序列的对比
class Solution:
def IsPopOrder(self,pushV, popV):
length = len(pushV)
if length ==1:
return pushV == popV
stack = []
if pushV and popV and length > 0:
x = 0
while x < len(popV):
# 弹出的元素
if stack and stack[-1] == popV[x]:
# 检查栈顶元素是否相等
stack.pop(-1)
x += 1
continue # 相等就继续下一个弹出元素
while pushV and pushV[0] != popV[x]:
# 如果弹出元素与压入序列中的头元素不同,
# 那么将头元素压入,直到找到第一个相等的元素
stack.append(pushV.pop(0))
if pushV and pushV[0] == popV[x]:
pushV.pop(0)
x += 1
if not pushV and stack[-1]!=popV[x] :
#如果push序列空了, 当前的当前pop序列的元素与辅助栈的顶元素不相等
#直接返回False
return False
return not stack