栈实现队列 与 队列实现栈

队列实现栈

思路

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

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

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

在这里插入图片描述

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

在这里插入图片描述

代码实现

# 栈实现队列
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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值