题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
题目解析——一
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
这一行表示需要执行的方法。
[[],[3],[],[],[]]
这一行表示执行的方法所需要的参数。
CQueue:表示新建队列,对应的参数为[],此操作不需要参数,返回值为null。
appendTail:表示执行一个appendTail()操作,此操作的参数为3,即将3压入栈,返回值为null。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,把3删除,返回值是3。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,此时没有参数了,返回值是 -1。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,此时没有参数了,返回值是 -1。
题目解析——二
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
这一行表示需要执行的方法。
[[],[],[5],[2],[],[]]
这一行表示执行的方法所需要的参数。
CQueue:表示新建队列,对应的参数为[],此操作不需要参数,返回值为null。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,此时栈内没有元素,返回值为 -1。
appendTail:表示执行一个appendTail()操作,此操作的参数为5,即将5压入栈,返回值为null。
appendTail:表示执行一个appendTail()操作,此操作的参数为2,即将2压入栈,返回值为null。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,也就是将队列中先进来的元素删除,把5删除,返回值是5。
deleteHead:表示执行一个deleteHead()操作,此操作不需要参数,将栈底的元素删除,此时队列中只有2了,把2删除,返回值是2。
思路
栈是先进后出,队列是先进先出。使用两个栈实现队列,使用栈1保存进来的元素,元素转移到栈2中,这样使用2个栈实现先进先出。
加入队尾 appendTail()函数:直接append()即可。
删除队首deleteHead()函数:有以下三种情况:
- 栈2不为空:此时栈2中有已完成倒序的元素,直接.pop()返回栈顶元素。
- 否则,栈1为空:即两个栈都为空,无元素,返回 -1。
- 否则:栈1不为空,栈2为空,此时使用while循环将栈1中的所有元素全部转移到栈2中,实现元素倒序。函数最后返回栈2的栈顶元素。
代码
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if self.stack2:
return self.stack2.pop()
if not self.stack1:
return -1
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()