大家好呀,我是蛋蛋。
今天用栈实现队列这道题,是考察对”栈和队列理解程度“的好题。
放心,在实际工作的时候,不是脑残十级,几乎不会提出这样奇怪的需求。
话不多说,直接开整。
LeetCode 232:用栈实现队列
题意
仅使用两个栈实现先入先出队列,队列支持一般队列支持的所有操作:
- void push(int x):将元素 x 推到队列的末尾。
- int pop():从队列的开头移除并返回元素。
- int peek():返回队列开头的元素。
- boolean empty():如果队列为空,返回 true;否则,返回 false。
示例
提示
- 1 <= x <= 9
- 最多调用 100 次 push、pop、peek 和 empty
- 假设所有操作都是有效的(eg. 一个空的队列不会调用 pop 或者 peek 操作)
题目解析
水题,难度简单,主要考察对栈和队列的理解能力。
如果对栈和队列还不熟悉,看一下下面这篇文章,某帅比写的:
**
仔细来看,主要涉及 4 种常规操作:
- 入队 push
- 出队 pop
- 判空 empty
- 取队首元素 peek
知道了要求,剩下就是如何用栈模拟队列。
队列是一种先入先出(FIFO)的数据结构,而栈是一种后入先出(LIFO)的数据结构,所以一个栈绝对满足不了队列的 FIFO 的特性。
比如 1 2 3,队列 1 2 3 进,应该 1 2 3 出,但是 1 2 3 进了栈,出来以后会成 3 2 1,和 1 2 3 是相反的,所以再需要一个栈,把 3 2 1 返成 1 2 3。
因此这里需要两个栈,分别是输入栈和输出栈:
输入栈来反转元素的入队顺序,元素入只能从输入栈进(push)。
输出栈用来存储元素的正常顺序,元素出只能从输出栈出(pop、peek)。