剑指 Offer 31. 栈的压入、弹出序列
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列
{1,2,3,4,5}
是某栈的压栈序列,序列{4,5,3,2,1}
是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}
就不可能是该压栈序列的弹出序列。
示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
方法一
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
# 默认序列是不对的
bPossible = False
n = len(popped)
if n == 0:
bPossible = True
# 如果输出序列长度大于输入序列长度,肯定不符合。
if len(pushed) < n :
return bPossible
if pushed and popped and n > 0 :
pushIndex = 0
popIndex = 0
dataStack = []
while popIndex < n:
# 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。
while not dataStack or dataStack[-1] != popped[popIndex]:
if pushIndex == n:
break
dataStack.append(pushed[pushIndex])
pushIndex += 1
# 如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
if dataStack[-1] != popped[popIndex]:
break
dataStack.pop()
popIndex += 1
if not dataStack and popIndex == n:
bPossible = True
return bPossible
方法二
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
stack = []
i = 0
for num in pushed:
stack.append(num) # num 入栈
while stack and stack[-1] == popped[i]: # 循环判断与出栈
stack.pop()
i += 1
return not stack