栈实现队列 与 队列实现栈

文章目录

    • 队列实现栈
      • 思路
      • 代码实现
    • 栈实现队列
      • 思路
      • 代码实现

队列实现栈

思路

假设我们有队列A和队列B,如何实现一个栈呢?

也就是说,给我们两个队列,依次push 1 2 3 4,如下图,如何让弹出的顺序是 4 3 2 1呢?

栈实现队列 与 队列实现栈_第1张图片

思路很简单,如下图,我们把队列A中的前(n-1)个元素pop,并push到队列B中,再弹出队列A中的元素。

栈实现队列 与 队列实现栈_第2张图片

然后,交换队列A和B,继续进行上述操作,直至两个队列均为空。

栈实现队列 与 队列实现栈_第3张图片

代码实现

# 栈实现队列
class Stack:
    def __init__(self):
        self.queueA = []
        self.queueB = []

    def push(self, elem):
        self.queueA.append(elem)

    def pop(self):
        while (len(self.queueA) > 1):
            self.queueB.append(self.queueA.pop(0))
        res = self.queueA.pop(0)
        self.queueA, self.queueB = self.queueB, self.queueA
        return res

if __name__ == '__main__':
    s = Stack()
    s.push(1)
    s.push(2)
    print(s.pop())
    s.push(3)
    print(s.pop())
    print(s.pop())

栈实现队列

思路

假设我们有栈A和栈B,如何实现一个队列呢?

也就是说,给我们两个栈,依次push 1 2 3 4,如下图,如何让弹出的顺序是 1 2 3 4呢?

在这里插入图片描述

思路也很简单,栈具有先进后出的特性,两个栈实现队列,正是用了“负负得正”的原理。

如下图,先把栈A中的元素依次push到栈B中,然后再从栈B中依次读取出 1 2 3 4。

在这里插入图片描述

需要注意的是,当栈B不为空时,从栈B中pop元素;当栈B为空时,将栈A中的元素push到栈B中,再从栈B中pop。

代码实现

class Queue:
    def __init__(self):
        self.stackA = []
        self.stackB = []

    def push(self, elem):
        self.stackA.append(elem)

    def pop(self):
        while (len(self.stackB) > 0):
            return self.stackB.pop(-1)
        while (len(self.stackA) > 0):
            self.stackB.append(self.stackA.pop(-1))
        return self.stackB.pop(-1)

if __name__ == '__main__':
    q = Queue()
    q.push(1)
    q.push(2)
    print(q.pop())
    q.push(3)
    print(q.pop())
    print(q.pop())

你可能感兴趣的:(算法,栈实现队列,队列实现栈)