[剑指Offer] 31_栈的压入、弹出序列

题目

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的
弹出顺序。假设压入栈的所有数字均不相等。

例:

序列{1, 2, 3, 4, 5}是一个压栈序列,{4, 5, 3, 2, 1}是该压栈序列的对应的一个弹
出序列,但{4, 3, 5, 1, 2}就不可能是该压栈序列的弹出序列。


思路

  1. 用辅助栈模拟操作过程。不是弹出序列就意味着违反了栈的弹出规则,要弹出的元素不在栈顶。两种可能:1、还未压入栈 2、已经压入栈,因此继续压入寻找,若为情况2则序列排空仍寻找不到,若为情况1则在中途将压入该元素。出现栈顶等于弹出序列头时,则立刻弹出该元素,因为如果再压入元素,就再也不能弹出该元素了,只能在此时弹出。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)

代码

def stack_push_pop_order(push_ord, pop_ord):
    """    
    :param push_ord:push sequence 
    :param pop_ord: pop sequence 
    :return: bool
    """
    stack = []
    while pop_ord:
        while not stack or stack[-1] != pop_ord[0]:
            if not push_ord:
                return False
            stack.append(push_ord.pop(0))
        stack.pop()
        pop_ord.pop(0)
    return True

思考

有没有不需要额外辅助空间的办法。通过判断弹出序列中每个元素再压入序列中的前后顺序?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值