(python version) 劍指offer 31.栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值