232. 用栈实现队列:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek()返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
- 你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
网址:https://leetcode-cn.com/problems/implement-queue-using-stacks/
解题思路:
栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。
本题主要考察对栈基础操作的理解及应用
队列主要涉及 4 种常规操作:
- 入队 push
- 出队 pop
- 判空 empty
- 取队首元素 peek
题解:
class MyQueue:
def __init__(self):
#初始化输入栈和输出栈
self.inStack = []
self.outStack = []
#push(x) ,入队操作,直接压入输入栈即可
def push(self,x:int)->None:
self.inStack.append(x)
#pop(), 出队操作,如果输出栈不为空的话,直接扔出栈顶元素,输出栈为空的话,那把输入栈的所有元素压入输出栈中,然后再扔出栈顶元素
def pop(self)->int:
#如果为空
if self.empty():
return None
#如果输出栈不为空,返回输出栈中的元素
if self.outStack:
return self.outStack.pop()
#输出栈元素为空,将输入栈中元素压入输出栈
else:
while self.inStack:
val = self.inStack.pop()
self.outStack.append(val)
return self.outStack.pop()
#empty(),判空操作。判空很简单,输入栈和输出栈都为空,则队列为空,否则队列不为空。
def empty(self)->bool:
#两个栈都为空,队列才为空
if not(self.inStack or self.outStack):
return True
return False
#peek(),取队列的首元素,和 pop() 的操作差不多。唯一的区别是,pop 是删掉了队首元素,而 peek 只是看队首元素
def peek(self)->int:
#使用已有的pop函数
res = self.pop()
#pop将元素弹出,所以需要重新添加进来
self.outStack.append(res)
return res