题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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()