剑指offer-python

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

2018-07-02  本文已影响0人  小歪与大白兔

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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
      
上一篇 下一篇

猜你喜欢

热点阅读