232. Implement queue using stack
思路
stack是先进后出,queue是先进先出,所以我们要借助另一个stack
append就加入原先的stack-in
在pop和peek的时候,如果借助的stack-out为空,就把所有原始stack-in的元素加进去
最后判断empty判断俩个均为空就行
def __init__(self):
self.s1 = []
self.s2 = []
def push(self, x: int) -> None:
self.s1.append(x)
def pop(self) -> int:
if len(self.s2) != 0:
return self.s2.pop()
else:
while len(self.s1) !=0:
self.s2.append(self.s1.pop())
return self.s2.pop()
def peek(self) -> int:
if len(self.s2) != 0:
return self.s2[-1]
else:
while len(self.s1) != 0:
self.s2.append(self.s1.pop())
return self.s2[-1]
def empty(self) -> bool:
return len(self.s1) == 0 and len( self.s2) == 0
- 时间复杂度: push和empty为O(1), pop和peek为O(n)
- 空间复杂度: O(n)
225. Implement stack using queue
思路
把queue size -1 的弹出来再加回去
队列模拟栈,其实一个队列就够了,那么我们先说一说两个队列来实现栈的思路。
队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。
所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。
但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。
优化
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了
class MyStack:
def __init__(self):
self.q = deque()
def push(self, x: int) -> None:
self.q.append(x)
def pop(self) -> int:
#poping from left and add to right
for i in range(len(self.q) - 1):
self.push(self.q.popleft())
return self.q.popleft()
def top(self) -> int:
return self.q[-1]
def empty(self) -> bool:
return len(self.q) == 0
- 时间复杂度: push为O(n),其他为O(1)
- 空间复杂度: O(n)
总结
stack 和 queue 不一样的结构导致了不同的implement方法。implement queue 的时候,要用俩个stack,但是implement stack 的时候,用一个queue就行了