用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]
原始代码为:
class CQueue:
def __init__(self):
def appendTail(self, value: int) -> None:
def deleteHead(self) -> int:
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
那么第一个问题来了:读不懂题!输入输出是啥玩意啊
答: 输入是操作和对应的输入值.
如操作是appendTail ,则对应的输入值只能是数字或[]; deleteHead输入值则只能是[]。
同理, 输出时,只有deleteHead有返回值,其余都是null。
具体如下面两图所示:
解题思路
- 构造两个栈(用list表示),一个是A,一个是B;
- 其中,A的顺序与队列相同,B则与A相反。
- 当appendTail的时候,A append一个元素,同时更新B(即B=A[::-1])
- 当deleteHead的时候,去掉队列的第一个元素即对比进行pop操作并返回pop的值,pop后更新A(即A=B[::-1])即可.当然,若此时B已经是null的,则直接返回-1,且该情况下无须更新A。
代码
class CQueue:
def __init__(self):
self.A = [] # 第一个栈,表示队列
self.B = [] # 第二个栈,表示队列的逆(逆队列)
def appendTail(self, value: int) -> None:
# append时只需要在A后面append即可
self.A.append(value)
# 除此之外,还要更新B
self.B = self.A[::-1]
def deleteHead(self) -> int:
if self.B:
result = self.B.pop() # 返回B的第一个元素
self.A = self.B[::-1] # 更新A
return result
else: # b是空的,且此时A=B,因此不需要对A判断且可直接返回-1
return -1
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
结果
总结
- append和pop的运用。两个操作均针对list的尾部,且pop可有返回值;
- 由两个栈完成对一个队列的操作值得注意。
- 此题在明白题意后书写起来并不困难,但这也和这几天做的题有关,继续坚持吧。