题目描述
使用栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
解题思路
要知道,栈的特点是先入后出,队列特点是先入先出,因此用栈的特性实现队列的特性,一个栈肯定是不够用的。因此选择使用两个栈来实现队列的上述操作。可以选择一个栈实现添加元素操作定义为put_in,而另一个栈实现取出元素操作定义为put_out。
首先是push,即在队列中添加元素,将其直接添加至put_in栈的末尾;
其次是pop,pop是删除队列的队首元素,也就是put_in栈的栈底元素,在删除队列元素之前,先要判断队列是否为空,接着将put_in的元素逐个放置在put_out栈中,再删除put_out的栈顶元素。(此时要判断put_out是否为空,put_out最初肯定是空的,当put_out不为空时,他的栈顶元素就是上一次pop操作的栈顶元素的下一个元素,此时put_out栈中的元素从高到低是按照队列的顺序排的)。
再是peek.注意peek仅仅是返回队列中的首位元素,但并不从队列中删除该元素,因此,使用pop将该元素取出后仍要添加回队列中;
最后是empty,判断队列是否为空,因为这里是用两个栈来实现队列,因此,要同时判断两个队列是否为空,只有两个栈同时为空(表示空语言判断为false)时,返回true。注意这里的判断逻辑
编程实现
class Myqueue:
def __init__(self):
self.put_in = []
self.put_out = []
def push(self, x):
self.put_in.append(x)
def pop(self):
if self.empty:
return true
if self.put_out:
return self.put_out.pop() ### 注意这里实现的是移除的队列首位元素一定不是原始队列的首位元素,因为put_out栈一开始是空的
for i in range(len(self.put_in)):
self.put_out.append(self.put_in.pop())
return self.put_out.pop()
def peek(self):
ans = self.put_out.pop()
self.put_out.append(ans)
return ans
def empty(self:
return not (self.put_in or self.put_out)