1.题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
来源:力扣(LeetCode)
2.解析
-
算法流程:
- 初始化: 初始化辅助栈 stack;
- 遍历压栈序列:元素 i入栈;
循环出栈:若 stack 的栈顶元素 == 弹出序列元素 popped[0],则执行出栈; - 返回值: 若 stack为空,则此弹出序列合法。
-
复杂度分析:
- 时间复杂度 O(N): 其中 N 为列表 pushed的长度;每个元素最多入栈与出栈一次,即最多共 2N次出入栈操作。
- 空间复杂度 O(N): 辅助栈 stack最多同时存储 NN个元素。
3.代码实现
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
# 语法错误,返回错误
if len(pushed) != len(popped):
return False
stack = []
for i in pushed:
stack.append(i) # num 入栈
while len(stack) and stack[-1] == popped[0]:
stack.pop()
popped.pop(0)
if len(stack):
return False
return True