剑指offer:Python 栈的压入、弹出序列 判断一个序列是否是该栈的弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路过程

  • 先来理解题意:什么是“弹出序列”?
    假如当序列[1,2,3,4,5]是压入顺序,在压入任意一个元素时,当前它作为栈顶元素可以选择弹出,栈顶下面的元素(先进)的元素可以选择弹出,所以[1,2,3,4,5] 的弹出序列可以是[1,2,4,5,3]、[1,2,4,3,5]、[4,5,3,2,1]…都可以,当时像[4,3,5,1,2]就是错的,错在 1 如果没有在压栈后弹出,就不比2先弹出了,[4,3,5,2,1]是正确的
    在这里插入图片描述

  • 如何实现?
    借助一个stack 来存放 push_value 的值,此时我们只要比较栈顶元素:push_value[-1]和 pop_value的元素是否相等,相等就弹出;注意 pus_value 可以选择 一直添加到某一个高度 继续添加 比较弹出栈顶元素,也可以添加高度后,弹出它身后的元素(先压入栈的元素);所以针对这种情况,我们只要用循环就能解决,只要stack里存在元素就去比较,如果知道stack pop 后为空,就说明push_value里的元素,都能按照pop的顺序依次找到,就说明,pop_value 是 push_value 的一个弹出序列!

Python实现

def find_pop(push_value, pop_value):
    if push_value is None or len(push_value) != len(pop_value): # 为空,或者长度不一致直接退出
        return None

    stack = []
    index = 0
    for item in push_value:
        stack.append(item)
        while stack and stack[-1] == pop_value[index]: # stack 有可能在压入一个元素后,就弹出,所以要考虑空的情况
            stack.pop()
            index += 1

    # if stack == []:
    #     return True
    # else:
    #     return False
    return True if stack == [] else False


push_value = [1, 2, 3, 4, 5]
pop_value = [4, 5, 3, 2, 1]

print(find_pop(push_value, pop_value)) # True

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值