剑指 Offer 09. 用两个栈实现队列
示例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]
思考:这个问题里面其实比较麻烦的是:示例看不懂 😵
其实第一行指的是操作类型,第二行是对应操作执行的元素。
1. “CQueue” : 指的是创建一个队列,返回了空
2. “appendTail” : 指的是在队尾增加一个元素,返回了空
3. “deleteHead” : 指的是删除头部元素,返回删除的元素 ,若队列内为空,则返回 -1 。
方法:两个栈实现队列
- 一个栈负责插入,另一个负责删除
- 时间复杂度: appendTail()函数为 O(1) ;deleteHead() 函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序。
- 空间复杂度: O(N) , 最差情况下,栈 A 和 B 共保存 N 个元素。
class CQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def appendTail(self, value: int) -> None:
self.stack_in.append(value)
def deleteHead(self) -> int:
if not self.stack_in and not self.stack_out: #两个栈都空
return -1
elif not self.stack_out: #出栈空,入栈不空
while len(self.stack_in) > 0:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop() #出栈不空,入栈不空