面试题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