面试题31:栈的压入、弹出序列

题目描述:

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

解题思路:

同min栈的思路相似,引入一个辅助栈stack,用来重现出栈的整个过程.
pushV = [1,2,3,4,5] popV = [4,3,5,1,2] stack = []

步骤 操作 stack 出栈元素
1 入栈1 [1]
2 入栈2 [1,2]
3 入栈3 [1,2,3]
4 入栈4 [1,2,3,4]
5 出栈4 [1,2,3] 4
6 出栈3 [1,2] 3
7 入栈5 [1,2,5]
8 出栈5 [1,2] 5

1.如果下一个要弹出的元素是栈顶元素,则直接弹出
2.如果下一个要弹出的元素不是栈顶元素,则把没有压入栈的元素压入stack,直到把下一个要弹出的元素压入栈顶
3.如果所有元素都已经压入,都没有成功将下一个要弹出的元素压入栈顶,则该序列不可能出现。

# -*- coding:utf-8 -*-
class Solution:
    def IsPopOrder(self, pushV, popV):
        # write code here
        if len(pushV)!=len(popV) or len(pushV)==0:
            return False
        #引入辅助栈stack,模拟出栈的过程
        stack = []
        position = 0
        for i in range(len(pushV)):
            stack.append(pushV[i])
            if popV[position]==pushV[i]:
                stack.pop()
                position = position + 1
            if stack:
                if popV[position]==stack[-1]:
                    stack.pop()
                    position = position + 1
                if i == len(popV)-1 and popV[position]!=stack[-1]:
                    return False
        return True
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数...
    夏臻Rock阅读 3,709评论 0 1
  • 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字...
    _minimal阅读 4,937评论 2 0
  • 栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。...
    echoVic阅读 3,430评论 0 1
  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。...
    鸿雁长飞光不度阅读 3,998评论 0 0
  • 真实故事: 有一天我放学回家,在路上我闻到了炒土豆丝的味道。我很馋,在那里站了很久。忽然想起来要回家,我小跑着往家...
    超级小吃货_85f2阅读 1,189评论 0 1