面试题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阅读 466评论 0 1
  • 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字...
    _minimal阅读 1,127评论 2 0
  • 栈的压入、弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。...
    echoVic阅读 389评论 0 1
  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。...
    鸿雁长飞光不度阅读 468评论 0 0
  • 真实故事: 有一天我放学回家,在路上我闻到了炒土豆丝的味道。我很馋,在那里站了很久。忽然想起来要回家,我小跑着往家...
    超级小吃货_85f2阅读 79评论 0 1
  • 夜晚沉沉,车灯幽幽, 晨光熹微,太阳不为所动 你在花园转了一个又一个圈 该来的目标还没出现 走出栅栏,闪入楼后 闯...
    蛇神阅读 105评论 0 0
  • 《清单革命》这本书吸引我的是“清单”二字,因为我知道我现在需要一份“清单”。 生活中每个人都会犯错,有些错误是小错...
    吾悦玫瑰阅读 421评论 0 0