《剑指offer》27、合法的pop序列

前言

本来这个应该和之前的26、包含min功能的栈写在一起的,都是辅助栈的应用。不过26的代码比较长,所以还是分开了。
本次题目的要求是:给出入栈序列push和一个出栈序列pop,判断pop序列是否合法。

分析

我们先上图说话

通过图左的合法序列和图右的不合法序列,我们可以得出一个判断依据:

1、如果下一个弹出的数字刚好是栈顶数字,那么直接弹出
2、如果下一个弹出的数字不在栈顶,我们就要把压栈序列中还没有入栈的数字继续压栈,直到下一个弹出的数字刚好是栈顶数字,即回到1
3、如果压栈到穿序列仍然没有回到1,那么pop序列不合法。

对于第二步,我们利用一个辅助栈就可以完成。

代码

# offer27-solution
def IsPopOrder(pushV, popV):
    stack = []
    while popV:
        # 元素进栈后立即出栈
        if pushV and pushV[0] == popV[0]:
            pushV.pop(0)
            popV.pop(0)
        # 如果当前辅助栈中的栈顶元素刚好是要弹出的元素,那么直接弹出
        elif stack and stack[-1] == popV[0]:
            stack.pop()
            popV.pop(0)
        # 不断往辅助栈中压入元素
        elif pushV:
            stack.append(pushV.pop(0))
        else:
            return False
    return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值