leetcode232用栈实现队列
示例:
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
解题思路:
栈是先进后出,队列是先入先出,为了实现队列的逻辑,那么需要两个栈。一个是输入栈,一个是输出栈。输入栈用于存放push进来的元素,当要进行pop或者peek操作时,需要把输入栈内容全部转移到输出栈中,此时顺序就正确了,可以对输出栈进行pop和peek操作。而empty操作是判断输入栈和输出栈是否为空。 输出栈非空时,禁止压入元素。必须一次性全部压入,否则一旦积压,最终的出栈顺序将被打乱
代码思路:
- 初始化两个数组作为栈
- push操作把数据放入输入栈a
- pop和peak操作类似,只是一个要把元素拿出来,一个是不需要拿出来。
代码:
class MyQueue:
def __init__(self):
"""
Initialize your data structure here.
"""
self.stack_a = []
self.stack_b = []
def push(self, x: int) -> None:
"""
Push element x to the back of queue.
"""
self.stack_a.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
if self.empty():
return None
if self.stack_b: #b不是空的
return self.stack_b.pop()
else:
len_a = len(self.stack_a)
while len_a:
self.stack_b.append(self.stack_a.pop()) #这里用的pop是内置的pop
len_a -=1
return self.stack_b.pop()
def peek(self) -> int:
"""
Get the front element.
"""
if self.empty():
return None
if self.stack_b:
return self.stack_b[-1]
else:
len_a = len(self.stack_a)
while len_a:
self.stack_b.append(self.stack_a.pop())
len_a -=1
return self.stack_b[-1]
def empty(self) -> bool:
"""
Returns whether the queue is empty.
"""
return not self.stack_a and not self.stack_b
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
入队时间复杂度:O(n)
对于除了新元素之外的所有元素,它们都会被压入两次,弹出两次。新元素只被压入一次,弹出一次。这个过程产生了 4n + 2 次操作,其中 n 是队列的大小。由于 压入 操作和 弹出 操作的时间复杂度为 O(1), 所以时间复杂度为 O(n)。
入队空间复杂度:O(n)
需要额外的内存来存储队列中的元素。
出队和peak和判断为空:O(1)