最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript中队列的详细介绍(代码示例)

来源:动视网 责编:小采 时间:2020-11-27 19:27:42
文档

JavaScript中队列的详细介绍(代码示例)

JavaScript中队列的详细介绍(代码示例):本篇文章给大家带来的内容是关于JavaScript中队列的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。队列的定义队列是遵循先进先出原则的一组有序的项,与栈的不同的是,栈不管是入栈还是出栈操作都是在栈顶操作,队列
推荐度:
导读JavaScript中队列的详细介绍(代码示例):本篇文章给大家带来的内容是关于JavaScript中队列的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。队列的定义队列是遵循先进先出原则的一组有序的项,与栈的不同的是,栈不管是入栈还是出栈操作都是在栈顶操作,队列


本篇文章给大家带来的内容是关于JavaScript中队列的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

队列的定义

队列是遵循先进先出原则的一组有序的项,与栈的不同的是,栈不管是入栈还是出栈操作都是在栈顶操作,队列则是在队尾添加元素,队顶移除,用一个图来表示大概是这样事的:

用一个更形象的例子就是:排队服务,总是先排队的人会先接受服务,当然不考虑插队的情况

队列的创建

与栈的创建类似,首先创建一个表示队列的函数,然后定义一个数组用来保存队列里的元素:

function Queue() {
 let items = []
}

创建队列后需要为其定义一些方法,一般来说队列包含以下方法:

  • enqueue(element):向队的尾部添加一个新的项

  • dequeue():移除队列第一项,并返回被移除的元素

  • front():返回队列第一项,队列不做任何变动

  • isEmpty():如果队列中没有任何元素返回true,否则返回false

  • size():返回队列包含的元素个数

  • 具体实现:

    function Queue() {
     let items = []
     // 向队列的尾部添加新元素
     this.enqueue = function (element) {
     items.push(element)
     }
     // 遵循先进先出原则,从队列的头部移除元素
     this.dequeue = function () {
     return items.shift()
     }
     // 返回队列最前面的项
     this.front = function () {
     return items[0]
     }
     // 返回队列是否为空
     this.isEmpty = function () {
     return items.length === 0
     }
     // 返回队列的长度
     this.size = function () {
     return items.length
     }
     // 打印队列,方便观察
     this.print = function () {
     console.log(items.toString())
     }
    }

    队列的使用

    接下来让我们看看队列的使用:

    let queue = new Queue()
    queue.enqueue('a')
    queue.enqueue('b')
    queue.enqueue('c')
    queue.dequeue()
    queue.print()

    首先向队列中添加三个元素:a,b,c,然后移除队列中的一个元素,最后打印现有队列,让我们一起图解这个过程:

    es6实现Queue

    和实现Stack类一样,也可以用es6的class语法实现Queue类,用WeakMap保存私用属性items,并用闭包返回Queue类,来看具体实现:

    let Queue = (function () {
     let items = new WeakMap
     class Queue {
     constructor () {
     items.set(this, [])
     }
     enqueue (element) {
     let q = items.get(this)
     q.push(element)
     }
     dequeue () {
     let q = items.get(this)
     return q.shift()
     }
     front () {
     let q = items.get(this)
     return q[0]
     }
     isEmpty () {
     let q = items.get(this)
     return q.length === 0
     }
     size () {
     let q = items.get(this)
     return q.length
     }
     print () {
     let q = items.get(this)
     console.log(q.toString())
     }
     }
     return Queue
    })()
    let queue = new Queue()
    queue.enqueue('a')
    queue.enqueue('b')
    queue.enqueue('c')
    queue.dequeue()
    queue.print()

    优先队列

    优先队列顾名思义就是:队列中的每个元素都会有各自的优先级,在插入的时候会根据优先级的高低顺序进行插入操作,和前面队列实现有点不太一样的地方,队列中的元素多了有先级的属性,下面来看具体代码:

    function PriorityQueue() {
     let items = []
     // 队列元素,多定义一个优先级变量
     function QueueElement(element, priority) {
     this.element = element
     this.priority = priority
     }
     this.enqueue = function (element, priority) {
     let queueElement = new QueueElement(element, priority)
     let added = false
     for (let i = 0; i < items.length; i++) {
     //数字越小优先级越高
     if (queueElement.priority < items[i].priority) {
     items.splice(i, 0, queueElement)
     added = true
     break
     }
     }
     if (!added) {
     items.push(queueElement)
     }
     }
     this.dequeue = function () {
     return items.shift()
     }
     this.front = function () {
     return items[0]
     }
     this.isEmpty = function () {
     return items.length === 0
     }
     this.size = function () {
     return items.length
     }
     this.print = function () {
     for (let i = 0; i < items.length; i++) {
     console.log(`${items[i].priority}-${items[i].element}`)
     }
     }
    }
    let priorityQueue = new PriorityQueue()
    priorityQueue.enqueue('a', 3)
    priorityQueue.enqueue('b', 2)
    priorityQueue.enqueue('c', 1)
    priorityQueue.dequeue()
    priorityQueue.print()

    入队时如果队列为空直接加入队列,否则进行比较,priority小的优先级高,优先级越高放在队列的越前面,下面用一个图来看调用过程:

    循环队列

    循环队列顾名思义就是:给定一个数,然后迭代队列,从队列开头移除一项,然后再将其加到队列末尾,当循环到给定数字时跳出循环,从队首移除一项,直至剩余一个元素,下面来看具体代码:

    unction Queue() {
     let items = []
     this.enqueue = function (element) {
     items.push(element)
     }
     this.dequeue = function () {
     return items.shift()
     }
     this.front = function () {
     return items[0]
     }
     this.isEmpty = function () {
     return items.length === 0
     }
     this.size = function () {
     return items.length
     }
     this.print = function () {
     console.log(items.toString())
     }
    }
    function loopQueue(list, num) {
     let queue = new Queue()
     for (let i = 0; i<list.length; i++) {
     queue.enqueue(list[i])
     }
     while (queue.size() > 1) {
     for (let j = 0; j<num; j++) {
     queue.enqueue(queue.dequeue())
     }
     let out = queue.dequeue()
     console.log('出队列:' + out)
     }
     return queue.dequeue()
    }
    console.log('last:' + loopQueue(['a', 'b', 'c', 'd', 'e'], 3))

    文档

    JavaScript中队列的详细介绍(代码示例)

    JavaScript中队列的详细介绍(代码示例):本篇文章给大家带来的内容是关于JavaScript中队列的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。队列的定义队列是遵循先进先出原则的一组有序的项,与栈的不同的是,栈不管是入栈还是出栈操作都是在栈顶操作,队列
    推荐度:
    标签: 介绍 详细 简介
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top