题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
思考:
队列是先入先出
栈是先入后出
题目中说的是实现队列的方法,要求的也是在队尾插入,在队头删除
可以设计两个栈
一个栈用来加入
另一个栈对A进行倒序,最终pop
或者直接pop(0),既然题目中要求的是两个栈那就再设置一个反转的栈吧
在python 中实现入栈和出栈比较方便的就是列表的反转和pop,例如
list2 = list1[::-1]
list1.pop()
题目中的意思大概为appendTail方法不输出,deleteHead方法中,如果列表有内容则返回开头的内容,没有内容则返回-1
解决方案:
class CQueue(object):
def __init__(self):
self.list1 = []
self.list2 = []
def appendTail(self, value):
"""
:type value: int
:rtype: None
"""
self.list1.append(value)
def deleteHead(self):
"""
:rtype: int
"""
self.list2 = self.list1[::-1]
if self.list2 :
self.list1.pop(0)
del_num = self.list2.pop()
return del_num
else :
return -1
需要注意的就是别忘了对list1进行pop(0),不然的话list1就没有改变,最后导致一直没有出栈
执行用时:1352 ms, 在所有 Python 提交中击败了39.53% 的用户
内存消耗:17.7 MB, 在所有 Python 提交中击败了6.62% 的用户
通过测试用例:55 / 55
标准答案
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()
函数设计:
加入队尾 appendTail() : 将数字 val 加入栈 A 即可。
删除队首deleteHead() : 有以下三种情况。
当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。
否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
标准答案相对于我写的函数而言,更加可以体现入栈出栈和倒序的思想