剑指offer_第5题_用两个栈实现队列

题目描述

  • 用两个栈来实现一个队列
  • 完成队列的Push和Pop操作
  • 队列中的元素为int类型

理解

解题思路

思路1

  • 栈是有序的 LIFO,也就是后进先出。
  • 队列是有序的FIFO,也就是先进先出。

当然无论是栈还是队列,在Python中一般都是用列表实现的,所以我们用列表表示能后进先出的栈。
那么现在问题是怎么用两个栈构造队列,我们知道队列是先进先出,题目中给了队列两个方法:

  • push:将元素放进队尾
  • pop: 将队顶的元素删除,并返回

为了实现这个两个函数,我们用两个栈分别存储队列中元素按从尾到头和从头到尾的两种排列形式。记:

  • stack1 表示队列中元素从尾到头的排列形式
  • stack2 表示队列中元素从头到尾的排列形式

stack1 列表(栈)的append操作即表示在队列尾部添加元素
stack2 列表(栈)的pop操作即表示在队顶删除元素,并返回结果

class Solution:
    def __init__(self):
        self.stack1=[]
        self.stack2=[]
    def push(self, node):
        if self.stack1:
            self.stack1.append(node)
        else:
            while self.stack2:
                self.stack1.append(self.stack2.pop())
            self.stack1.append(node)
    def pop(self):
        if self.stack2:
            return self.stack2.pop()
        elif self.stack1:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()
        else:
            return None

当然上述逻辑可以再精简一点实现,如下:

class Solution:
    def __init__(self):
        self.stack1=[]
        self.stack2=[]
    def push(self, node):
        if self.stack2:
            while self.stack2:
                self.stack1.append(self.stack2.pop())
        self.stack1.append(node)
    def pop(self):
        if self.stack1:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()

猜你喜欢

转载自blog.csdn.net/Datawhale/article/details/82118919
今日推荐