栈的压入、弹出序列

题目描述

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

思路题解

借助一个辅助栈,首先通过遍历压栈顺序将第一个元素放入栈中,然后判断栈顶元素是不是出栈序列中的第一个元素,若是,出栈第一个元素,同时将出栈顺序向后移一位,出栈序列该元素弹出,直到不相等;若不是,将压栈序列中的元素继续压入栈中,直到栈顶元素与出栈序列中的元素相等;这样循环等压栈顺序遍历完成后,辅助栈还不为空,说明弹出序列不是该栈的弹出序列。

举例

入栈:1,2,3,4,5

出栈:4,3,5,1,2

入栈序列1进栈,入栈序列1不等于出栈序列4,入栈序列2进栈;

入栈序列2不等于4,3进栈;

入栈序列3不等于4,4进栈;

入栈序列4等于4,出栈4;

入栈序列3等于3,3出栈;

入栈序列2不等于5,5进栈;

入栈序列5等于5,5出栈;

此时栈中有1,2(栈顶元素),出栈序列中的1并不等于栈顶元素2,故不能出栈。栈中元素非空,此出栈序列不是入栈序列的弹出序列。

代码实现

# -*- coding:utf-8 -*-
class Solution:
    def IsPopOrder(self, pushV, popV):
        # write code here
        stack=[]  #借助中间栈判断
        while(popV):
            #入栈序和出栈序中第一个元素相同,相当于该元素入栈后便出栈
            #直接对pushV和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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值