python如何根据入栈序列判断出栈队列是否是可能的出栈队列

时间:2019-02-19
本文章向大家介绍python如何根据入栈序列判断出栈队列是否是可能的出栈队列,主要包括python如何根据入栈序列判断出栈队列是否是可能的出栈队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
class MyStack:
    """先实现栈"""
    def __init__(self):
        self.item = []
    #判断栈是否为空
    def isEmpty(self):
        return  not self.item
    #返回栈的大小(就是列表长度)
    def size(self):
        return len(self.item)
    #返回栈顶元素(就是列表尾部的元素)
    def top(self):
        if self.item:
            return self.item[-1]
        else:
            return None
    #弹出栈顶元素
    def pop(self):
        if len(self.item)>0:
            return self.item.pop()
        elif len(self.item) == 0:
            print("栈已经为空")
            return None
    #压入一个元素item到栈顶
    def push(self,item):
        self.item.append(item)
#判断出栈顺序的正确性
def isPopSerial(push,pop):
    pushIndex = 0
    popIndex = 0
    if push == None or pop == None:
        return False
    if len(push) != len(pop):
        return False
    else:
        s = MyStack()
        s.push(push[0])
        while popIndex < len(push):#能根据规则正常弹出所有数据,并且推出循环,则证明这个出栈顺序是正确的
            if s.top() != pop[popIndex]:#如果栈顶元素不等于pop序列所指的元素,就把push序列下一个元素压入
                try:
                    pushIndex += 1
                    s.push(push[pushIndex])
                except:
                    break#当pushIndex大于push长度时,说明pop出栈顺序有误,退出循环
            else:#如果栈顶元素等于pop序列所指的元素,那就弹出这个栈顶,pop指针往后继续监测
                s.pop()
                popIndex += 1

    	return popIndex == len(pop)#如果循环结束popIndex指针走到了最后,说明pop顺序是正确的

if __name__ == "__main__":
    push = "12345"
    pop = "53421"
    if isPopSerial(push, pop):
        print("yes")
    else:
        print("no")