[剑指Offer] 31_栈的压入、弹出序列

版权声明: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. 用辅助栈模拟操作过程。不是弹出序列就意味着违反了栈的弹出规则,要弹出的元素不在栈顶。两种可能:1、还未压入栈 2、已经压入栈,因此继续压入寻找,若为情况2则序列排空仍寻找不到,若为情况1则在中途将压入该元素。出现栈顶等于弹出序列头时,则立刻弹出该元素,因为如果再压入元素,就再也不能弹出该元素了,只能在此时弹出。
    1. 时间复杂度:O(n)
    2. 空间复杂度: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

思考

有没有不需要额外辅助空间的办法。通过判断弹出序列中每个元素再压入序列中的前后顺序?

猜你喜欢

转载自blog.csdn.net/u013908099/article/details/86368660
今日推荐