一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
前言
上篇文章我们基于数组的创建了一个队列类,他与数组创建的栈一样,不是最完美的。本篇文章我们基于对象来创建一个队列类。看看是否和你们的想法一致呢。
队列的方法
首先,我们照旧回顾队列都需要哪些方法:
- push() 在队尾添加一个元素(同样,由于采用对象存储,牺牲了一次保存多个变量)
- pop() 移除队头元素,同时返回队头元素
- top() 返回队头元素,不改变队列
- isNull() 队列是否为空
- claer() 清空队列
- size() 队列中剩余元素个数
编码实现
回顾结束,又到了喜闻乐见的编码环节:
创建类
class Queue{
constructor(){
//对象存储,由于对象是无需存储,所以需要辅助变量来优化结构
this.items = {}
//队尾指针
this.end = 0
//队头指针,可以思考一下为什么要这样设计
this.start = 0
}
}
push
//为了性能,牺牲保存多个变量的功能,要实现多个变量保存得循环,得不偿失
push(data){
this.items[this.end] = data
this.end++
}
pop
pop(){
if(this.isNull()){
return undefined
}
//用辅助变量start来帮助我们记住队头,不用循环去删除队头了
const result = this.items[this.start]
delete this.items[this.start]
this.start++
return result
}
top
top(){
return this.items[this.start]
}
isNull
isNull(){
return this.end - this.start === 0
}
clear
clear(){
this.items = {}
this.end = 0
this.start = 0
}
size
size(){
return this.end - this.start
}
完整代码如下:
class Queue{
constructor(){
this.items = {}
this.end = 0
this.start = 0
}
push(data){
this.items[this.end] = data
this.end++
}
pop(){
if(this.isNull()){
return undefined
}
const result = this.items[this.start]
delete this.items[this.start]
this.start++
return result
}
top(){
if(this.isNull()){
return undefined
}
return this.items[this.start]
}
isNull(){
return this.end - this.start === 0
}
clear(){
this.items = {}
this.end = 0
this.start = 0
}
size(){
return this.end - this.start
}
}
const queue = new Queue()
console.log(queue.isNull()); //true
queue.push(1)
queue.push(2)
queue.push(3)
queue.push(4)
queue.push(5)
console.log(queue.size()); //5
console.log(queue.top()); //1
console.log(queue.pop()); //1
console.log(queue.top()); //2
console.log(queue.size()); //4
console.log(queue.isNull()); //false
queue.clear()
console.log(queue.isNull()); //true
console.log(queue.size()); //0
总结
本篇实现的对象存储是否和各位老爷的一致?可以思考在此基础上如何实现双端队列与循环队列呢?