版权声明:Tian Run https://blog.csdn.net/u013908099/article/details/86368660
题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的
弹出顺序。假设压入栈的所有数字均不相等。
例:
序列{1, 2, 3, 4, 5}是一个压栈序列,{4, 5, 3, 2, 1}是该压栈序列的对应的一个弹
出序列,但{4, 3, 5, 1, 2}就不可能是该压栈序列的弹出序列。
思路
- 用辅助栈模拟操作过程。不是弹出序列就意味着违反了栈的弹出规则,要弹出的元素不在栈顶。两种可能:1、还未压入栈 2、已经压入栈,因此继续压入寻找,若为情况2则序列排空仍寻找不到,若为情况1则在中途将压入该元素。出现栈顶等于弹出序列头时,则立刻弹出该元素,因为如果再压入元素,就再也不能弹出该元素了,只能在此时弹出。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
代码
def stack_push_pop_order(push_ord, pop_ord):
"""
:param push_ord:push sequence
:param pop_ord: pop sequence
:return: bool
"""
stack = []
while pop_ord:
while not stack or stack[-1] != pop_ord[0]:
if not push_ord:
return False
stack.append(push_ord.pop(0))
stack.pop()
pop_ord.pop(0)
return True
思考
有没有不需要额外辅助空间的办法。通过判断弹出序列中每个元素再压入序列中的前后顺序?