剑指Offer09.用两个栈实现队列

题目:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:

["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]


输出:

[null,null,3,-1]


示例 2:

输入:

["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]


输出:

[null,-1,null,null,5,2]

分析:

这边先插一句,栈操作的输入输出是后进先出,队列操作是先进先出,要了解下这两个的区别。

这题一开始没看明白,其实就是利用两个栈,来实现一个队列元素的输入与输出。我们可以把两个栈分为输入栈A和输出栈B,A来实现队列Q的输入,B来实现队列Q的输出。

举例说明:现在我们想实现一个1到5的队列,其中穿插着输入和输出操作。首先拿一个空队列,这时两个栈也是空。假设我们预想的操作是先一次输入1、2,再进行一次输出,再输入3、4,再输出四次,最后把5输入。那么操作如下:(看懂下面的操作便能明白这道题,一边看一边动手画一画)

第一步:实现两次进队列操作。首先在栈A中压入1、2,这时队列也是[1,2]。

第二步:实现一次出队列操作。这时就要在输出栈B中进行一次出栈操作,但这时B为空,所以我们将栈A的元素输出并压入栈B,栈A为空,栈B的元素为[2,1],这时对B进行出栈操作,则删去了1,队列变为[2],即实现了出队列的操作。

第三步:实现两次进队列操作。将3、4压入栈A,这时栈A:[3,4],栈B:[2],队列为[2,3,4]。

第四步:实现四次出队列操作。出队列就要在输出栈B中进行出栈操作。第一次执行时,栈B中有元素,则进行一次出栈操作,完成之后栈A不变,栈B为空,队列变为[3,4]。第二次执行时,栈B为空,则将栈A中的元素输出压入栈B,此时栈A为空,栈B为[4,3];接下来进行出栈操作,完成后A仍为空,B为[4],队列为[4]。第三次执行时,同第一次执行,完成后栈A、B都为空,此时队列也为空。第四次执行时,由于两个栈皆为空,我们返回-1。

第五步:执行一次进队列操作。同第一步。

答题:

class CQueue:
    def __init__(self):
        self.A, self.B = [], []

    def appendTail(self, value: int) -> None:
        self.A.append(value)

    def deleteHead(self) -> int:
        if self.B: return self.B.pop()
        if not self.A: return -1
        while self.A:
            self.B.append(self.A.pop())
        return self.B.pop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馆长布鲁克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值