栈和队列问题是leetcode刷题中很常见的问题。(我记得快手面试的时候问的就是这个问题,可惜用的是解法1,不是最优解)
栈的特性:先入后出
队列的特性:先入先出
在python中可以直接使用List去维护栈和队列。初始化:栈stack=[],队列queue=[]
1)栈:入栈:stack.append(val);出栈:stack.pop(-1)
2)队列: 入队列:queue.append();出队列:queue.pop(0)
用两个栈实现队列,python解法1,在deleteHead的过程中,先将stack1中的数据都push到stack2中,然后将stack2的栈顶元素pop出来作为结果,再将stack2中的数据都push到stack1中。显然这样做是没有问题的,的确可以AC,但是时间复杂度很高,重复的将两个栈的数据来回push、pop显然很冗余。
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if len(self.stack1) == 0:
return -1
else:
size = len(self.stack1)
while size > 0:
size -= 1
self.stack2.append(self.stack1.pop(-1))
res = self.stack2.pop(-1)
size = len(self.stack2)
while size > 0:
size -= 1
self.stack1.append(self.stack2.pop(-1))
return res
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
用两个栈实现队列,python解法2。则是去除冗余的两个栈的数据来回push、pop操作。下面的图主要说明了去除冗余操作的主要工作流程。
python解法2是最优解,python实现如下所示:时间复杂度O (n),空间复杂度O(n)
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if len(self.stack2) > 0:
return self.stack2.pop(-1)
else:
size = len(self.stack1)
if size == 0:
return -1
while size > 0:
size -= 1
self.stack2.append(self.stack1.pop(-1))
return self.stack2.pop(-1)