算法训练营(day10)
算法训练营(day10)
栈和队列理论基础
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)
232.用栈实现队列
题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
- 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作
(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
和isEmpty
操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
解题思路
解题过程:
- 题目要求使用两个栈实现队列,定义一个栈为输入栈,一个栈为输出栈
- 根据栈和队列的原理,实现队列 先进先出 的特性
- 根据栈 先进后出 的特性,只需将数据依次压栈出栈两个栈,即可实现 先进先出 的功能
详细代码
1 | class MyQueue { |
225. 用队列实现栈
题目链接:https://leetcode.cn/problems/implement-stack-using-queues/
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)
。实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
注意:你只能使用队列的基本操作 —— 也就是 push to back
、peek/pop from front
、size
和 is empty
这些操作。
你所使用的语言也许不支持队列。 你可以使用 list
(列表)或者 deque
(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
解题思路
解题过程:
- 使用两个队列 (queue/deque) 最终都可优化成一个队列求解
模拟队列
ArrayDeque
和 LinkedList
都可以模拟实现栈和队列,但两者存在区别
ArrayDeque
:内部以数组的形式保存集合中的元素,因此随机访问元素时有较好的性能,插入删除时性能较差。LinkedList
:内部以双向链表的形式来保存集合中的元素,因此随机访问集合中的元素时虽然性能较差,但在插入、删除元素时性能较好。
详细代码
解法一:使用一个双端队列
1 | class MyStack { |
解法二:使用一个队列
1 | class MyStack { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小明学习博客!
评论
ValineDisqus