JavaScript数据结构——队列

136 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 ——百度百科

简单来说,队列是遵循先进先出(FIFO,First In First Out)原则的一组有序集合。生活中买票排队就是很常见的队列。

image.png

创建一个队列

class Queue {
    constructor(){
        //由于js数组的特性,先来实现数组版本的
        this.items = []
    }
}

队列中的方法

  • push() 向队尾添加一个或多个元素
  • pop() 移除队头元素
  • top() 返回队头,不改变队列
  • isNull() 是否为空队列
  • clear() 清空队列
  • size() 返回队列的元素个数

push

push(...data){
    this.items.push(...data)
}

pop

pop(){
    return this.items.shift()
}

top

top(){
    return this.items[0]
}

isNull

isNull(){
    return this.items.length === 0
}

clear

clear(){
    this.items = []
}

size

size(){
    return this.items.length
}

完整代码如下:

class Queue {
    constructor(){
        this.items = []
    }
    push(...data){
        this.items.push(...data)
    }
    pop(){
        return this.items.shift()
    }
    top(){
        return this.items[0]
    }
    isNull(){
        return this.items.length === 0
    }
    clear(){
        this.items = []
    }
    size(){
        return this.items.length
    }
}
const queue = new Queue()
console.log(queue.isNull()); //true
queue.push(1)
queue.push(2)
queue.push(3,4,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

总结

本章我们实现了一个基于数组的简单的队列类,由于是基于数组,所以,他也有和基于数组实现的栈类相同的缺点(消耗更多的内存空间;数据量过大耗时更久)。下章我们会进行优化,基于对象实现。感兴趣的伙伴可自行实现,并可以想想循环队列与双端队列应该如何实现。