题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
来源:力扣(LeetCode)
解题思路
- 建立一个辅助栈
- 找出弹出的第一个值位于压入栈的位置,以此位置
ix
作为分割点,分为pushed
以及tmp_stack
两个栈。 - 接著以
popped
的最左边(首位) 与pushed
的最右边(顶端)比较,若相同,则同时移除; 若不同则从tmp_stack
压入新的数值进入栈。 - 上述算法成立条件为:当
popped
有值,且pushed
或是tmp_stack
有值的时候。
Python代码
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
# 特殊情况考虑:input 为 Null值时
if not popped:
return True
if not pushed and popped:
return False
# 暂时栈
tmp_stack = []
# 分割点
first = popped.pop(0)
ix = pushed.index(first)
tmp_stack.extend(pushed[ix+1:])
pushed = pushed[:ix]
# 算法执行条件
while popped and (pushed or tmp_stack):
if pushed and (popped[0] == pushed[-1]):
popped.pop(0)
pushed.pop()
elif tmp_stack:
pushed.append(tmp_stack.pop(0))
else:
return False
return True