BFE.dev前端刷题#108. 用队列(Queue)实现栈(Stack)
时间:2022-07-24
本文章向大家介绍BFE.dev前端刷题#108. 用队列(Queue)实现栈(Stack),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在上面的刷题日记。
题目108
BFE.dev#108 利用队列(Queue)实现栈(Stack)
分析
假设我们有一个队列
[1,2,3,4]
复制代码
如果我们要pop
4的话,因为这是一个队列,我们只能把1 dequeue掉。所以为了要得到4,我们必须要把其余的1,2,3给dequeue掉。dequeue掉的元素因为只能用队列,所以需要用第二个队列来装。比如这样:
[4], [1,2,3]
复制代码
现在我们可以取得4了。
[ ] , [1,2,3]
复制代码
这时候我们可以把1,2,3放回去。但是这会让peek()
的实现比较麻烦,因为单纯为了peek()
也要重复上述操作的话,太浪费了。
为了解决这个问题,我们可以好好利用这两个queue,让其中一个queue始终只有一个元素。比如。
[ ], [ ]
复制代码
现在添加1,我们需要enqueue即可。
[1], [ ]
复制代码
添加2,enqueue过后,我们保持第一个queue只有一个元素,所以把1放入第二个queue。
[1,2], [ ]
[2], [1]
复制代码
添加3和4的时候,重复相同操作。
[2,3], [1]
[3], [1,2]
[3,4], [1,2]
[4], [1,2,3]
复制代码
现在我们可以dequeue 4了。
[ ], [1,2,3]
复制代码
因为第一个queue成了空,我们可以尝试让第二个queue包含只有一个元素。
[1,2], [3]
复制代码
现在我们可以交换两个queue的地位,这样就变成了和之前完全一样的状态。
[3], [1, 2]
复制代码
OK,综上所述,我们只需要有两个queue。
-
queue1
始终保持只有一个元素(或者初始都为空的状态) -
queueRest
用来存放其余的元素
来,代码写起来
如下代码完全是按照上述想法的复现,就不再说明了。
class Stack {
constructor() {
this.queue1 = new Queue()
this.queueRest = new Queue()
}
push(element) {
this.queue1.enqueue(element)
this._move()
}
_move() {
while (this.queue1.size() > 1) {
this.queueRest.enqueue(this.queue1.dequeue())
}
}
peek() {
return this.queue1.peek()
}
pop() {
if (this.queue1.size() === 0) {
return undefined
}
const element = this.queue1.dequeue()
// swap if the other queue is not empty
if (this.queueRest.size() > 0) {
;[this.queue1, this.queueRest] = [this.queueRest, this.queue1]
this._move()
}
return element
}
size() {
return this.queue1.size() + this.queueRest.size()
}
}
复制代码
通过,撒花!
如果你感兴趣可以去BFE.dev 试试 bigfrontend.dev/zh/problem/…
感谢阅读,希望有所帮助,下次见!
- 巧用CSS3 :target 伪类制作Dropdown下拉菜单(无JS)
- 开源的虚拟机软件 VirtualBox v1.5.2
- Farseer:一个用于Silverlight和XNA的开源物理引擎
- Visual Studio 2008 debug的时候发生郁闷的错误ContextSwitchDeadlock was detected
- LINQ TO XML
- 不被未来折叠掉:AI时代下的思考
- Google 分析的基准化测试
- WebFont 三宗罪之一:WebFont 与 FOUT
- 探究基于声明的身份标识
- 深化“互联网+先进制造业”发展工业互联网的系列解读二:打造平台体系
- WebFont 三宗罪之二:吹毛求疵的WebFont 渲染差异
- IDC发布IT转型报告,现代化、自动化、转型三要素必不可少
- 存储过程和触发器的应用
- 两部委印发车联网产业标准体系建设指南 提到了自动驾驶
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- miRBase物种名缩写
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- 在R语言中使用航空公司复杂网络对疫情进行建模
- R语言用关联规则和聚类模型挖掘处方数据探索药物配伍中的规律
- ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
- ggalluvial|炫酷桑基图(Sankey),你也可以秀
- R|批量循环处理同一格式文件-csv,txt,excel
- 误差线怎么画,写不写代码as you like
- Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化
- Forest plot(森林图) | Cox生存分析可视化
- R-forestplot包| HR结果绘制森林图
- 韦恩图
- R-plotly|交互式甘特图(Gantt chart)-项目管理/学习计划
- Python的这些高级用法你都知道吗?
- ggstatsplot绘图|统计+可视化,学术科研神器