232.用栈实现队列
题目链接/文章讲解/视频讲解:代码随想录
队列是先进先出,栈是先进后出
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,要思考一下如何把代码抽象出来。
1.代码复现
class MyQueue:
def __init__(self):
#入栈与出栈
self.stack_in=[]
self.stack_out=[]
def push(self, x: int) -> None:
#入栈直接把元素添加进去就行
self.stack_in.append(x)
def pop(self) -> int:
#出栈要判断stack_out是否为空,如果为空,要把stack_in中的元素全部放入stack_out中,再出栈
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
与pop()函数有重复的地方,要会复用
result = self.pop()
self.stack_out.append(result)
return result
def empty(self) -> bool:
if self.stack_in and self.stack_out:
return True
else:
return False
初始化定义的时候,一定要写self.stack_in 以及self.stack_out,这样这个栈才能在后序定义的函数里操作。
2.复杂度分析
入队self.push() 时间复杂度O(1),直接把元素append到stack_in栈中的最后就行; 空间复杂度O(1),stack_in 栈多储存一个元素;
出队self.pop() 时间复杂度O(N),需要把所有元素全部压入stack_out栈中,再出栈一个元素; 空间复杂度O(N)需要额外的N个内存来储存队列中的元素;
取队首元素self.peek() 因为需要调用self.pop(),然后再push,时间复杂度O(N);空间复杂度O(N);
判断空self.empty() 只需要判断两个栈是否为空即可,时间复杂度O(1),空间复杂度O(1)
225. 用队列实现栈
题目链接/文章讲解/视频讲解:代码随想录
队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序,队列模拟栈的时候只需要一个队列就能实现。
具体的Python实现注意事项: 1.Python普通的Queue或SimpleQueue没有类似于peek的功能,也无法用索引访问,在实现top的时候较为困难; 2.用list可以,但是在使用pop(0)的时候时间复杂度为O(n);
因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能。
代码实现
class MyStack:
def __init__(self):
self.queue=deque()
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
return self.queue.popleft()
def top(self) -> int:
res = self.pop()
self.queue.append(res)
return res
def empty(self) -> bool:
if self.queue:
return False
else:
return True
思考:
对于deque()自己之前是完全不了解的。deque实现了两端都可以操作的队列,相当于双端队列。具体deque()的用法参考了如下文章:文章https://blog.csdn.net/weixin_43790276/article/details/107749745?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170584468416800213065923%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170584468416800213065923&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-107749745-null-null.142%5Ev99%5Epc_search_result_base7&utm_term=python%20deque&spm=1018.2226.3001.4187