JavaScript数据结构——队列(2)

155 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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

总结

本篇实现的对象存储是否和各位老爷的一致?可以思考在此基础上如何实现双端队列与循环队列呢?