31栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。

def stack_is_pop_order(pushV, popV):
    """
    @author:黄健楸
    @params:pushV 压入顺序 list
            popV  弹出顺序 list
    @aim:   判断popV是否是pushV的一个弹出顺序
    @method:构造辅助栈stack_help,当该栈顶的元素为popV的首个元素时,
            将该元素从stack_help和popV弹出。
            直到pushV的元素全部压入,stack_help和popV也全部弹出,
    @return:若stack_help和popV没有元素了,则返回True,否则返回False。
    """
    if not pushV or not popV or len(pushV) != len(popV):
        return False
    stack_help = list()
    while pushV:
        stack_help.append(pushV.pop(0))
        while stack_help and popV and stack_help[-1] == popV[0]:
            stack_help.pop()
            popV.pop(0)
    if stack_help or popV:
        return False
    else:
        return True

if __name__ == "__main__":
    push1 = [1, 2, 3, 4, 5]
    push_void = []
    pop1 = [4, 5, 3, 2, 1]
    pop2 = [4, 5, 3, 1, 2]
    pop3 = [4, 5, 3, 2]
    pop_void = []

    # functional tests 
    assert stack_is_pop_order(push1, pop1) is True
    assert stack_is_pop_order(push1, pop2) is False

    # robust tests
    assert stack_is_pop_order(push_void, pop1) is False
    assert stack_is_pop_order(push1, pop_void) is False
    assert stack_is_pop_order(push1, pop3) is False

你可能感兴趣的:(31栈的压入、弹出序列)