| 栈的压入和弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,
请判断第二个序列是否为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如,序列 {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 之前弹出。
| 题解
class Solution:
"""
解题思路:
1.p指针执行pushed,q指针指向poped的第一个元素
2.同时遍历pushed 和 popped
3.判断p指针元素是否跟q指针元素相同
1.如果不等 p指针后移一个单位,直到相等为止
1.如果一直不等,返回false
2.如果行等,让行等的两个元素出栈
2.如果相等 让相等的两个元素出栈
4.出栈后,p指针指向前一个元素
1.继续判断p和q是否相等
1.如果相等 继续出栈
2.如果不等继续 p指针继续后移
5.知道遍历结束
1.判断pushed和popped 是否为看空
1.如果为空 返回True
2.如果不为空 返回False
"""
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
length = len(pushed)
p, q = 0, 0
while length > p and length > q:
if popped[q] == pushed[p]:
pushed.pop(p)
popped.pop(q)
p = p - 1 if p > 0 else 0
else:
p += 1
length = len(pushed)
if length == 0:
break
return False if pushed and popped else True