输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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