python算法题:如何根据入栈序列判断可能的出栈序列

1.输入两个序列,其中一个序列表示栈的push(入)序列,判断另一个序列有没有可能是对应的pop(出)序列

class Stack:
    def __init__(self):
        self.item = []

    def empty(self):
        return len(self.item) == 0

    def size(self):
        return len(self.item)

    #返回栈顶元素
    def peek(self):
        if not self.empty():
            return self.item[-1]
        else:
            return None

    def pop(self):
        if len(self.item) > 0:
            return self.item.pop()
        else:
            return None

    def push(self,value):
        self.item.append(value)


def isPopSerial(push,pop):
    if push == None or pop == None:
        return False
    pushLen = len(push)
    popLen = len(pop)
    if pushLen != popLen:
        return False
    pushIndex = 0
    popIndex = 0
    stack = Stack()
    while pushIndex < pushLen:
        stack.push(push[pushIndex])
        pushIndex += 1
        while (not stack.empty()) and stack.peek() == pop[popIndex]:
            stack.pop()
            popIndex +=1
    return stack.empty() and popIndex == popLen

if __name__ == '__main__':
    push = [1,2,3,4,5]
    pop = [3,2,5,4,1]
    if isPopSerial(push,pop):
        print('yes')
    else:
        print('no')

3.上面这种方法在一个合理的pop序列的时候需要操作的次数最多,即把push序列进行一次压栈和出栈操作,操作次数为2N,因此,时间复杂度为O(N),此外,这种方法使用了额外的栈空间,因此,空间复杂度为O(N)

猜你喜欢

转载自blog.csdn.net/weixin_43697214/article/details/115100466
今日推荐