题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路过程
-
先来理解题意:什么是“弹出序列”?
假如当序列[1,2,3,4,5]是压入顺序,在压入任意一个元素时,当前它作为栈顶元素可以选择弹出,栈顶下面的元素(先进)的元素可以选择弹出,所以[1,2,3,4,5] 的弹出序列可以是[1,2,4,5,3]、[1,2,4,3,5]、[4,5,3,2,1]…都可以,当时像[4,3,5,1,2]就是错的,错在 1 如果没有在压栈后弹出,就不比2先弹出了,[4,3,5,2,1]是正确的
-
如何实现?
借助一个stack 来存放 push_value 的值,此时我们只要比较栈顶元素:push_value[-1]和 pop_value的元素是否相等,相等就弹出;注意 pus_value 可以选择 一直添加到某一个高度 继续添加 比较弹出栈顶元素,也可以添加高度后,弹出它身后的元素(先压入栈的元素);所以针对这种情况,我们只要用循环就能解决,只要stack里存在元素就去比较,如果知道stack pop 后为空,就说明push_value里的元素,都能按照pop的顺序依次找到,就说明,pop_value 是 push_value 的一个弹出序列!
Python实现
def find_pop(push_value, pop_value):
if push_value is None or len(push_value) != len(pop_value): # 为空,或者长度不一致直接退出
return None
stack = []
index = 0
for item in push_value:
stack.append(item)
while stack and stack[-1] == pop_value[index]: # stack 有可能在压入一个元素后,就弹出,所以要考虑空的情况
stack.pop()
index += 1
# if stack == []:
# return True
# else:
# return False
return True if stack == [] else False
push_value = [1, 2, 3, 4, 5]
pop_value = [4, 5, 3, 2, 1]
print(find_pop(push_value, pop_value)) # True