JavaScript数据结构与算法——队列详解(上)

队列基本知识

队列是一种与列表很像的数据结构,只是队列只能在尾部插入元素,在队首删除元素。队列用于存放按顺序排列的元素,先进先出,就像食堂排队一样,后来的只能排在后面,先来的先拿饭,一种井然有序的感觉。
对队列的主要操作是入队和出队,即往队尾插入元素以及删除队首元素,此外队列还需要有用于访问队首元素的方法、返回队列长度的方法等等,下面我们将一一实现。

JS中队列的实现

借助JavaScript中的数组,我们可以轻松实现队列数据结构,数组的push() 方法可以往数组尾插入元素,shift() 方法则可以将数组头元素删除,接下来我们来实现队列数据结构:

实现队列构造函数

// Created by xiaoqiang on 07/04/2018.
function Queue() {
    this.data = []            // 存放数据
    this.enQueue = enQueue    // 入队操作
    this.deQueue = deQueue    // 出队操作
    this.first = first        // 访问第一个元素
    this.last = last          // 访问最后一个元素
    this.toString = toString  // 显示队列中的数据
    this.empty = empty        // 判断队列是否为空
}

实现入队方法

function enQueue(param) {
    this.data.push(param)
    return this
}

使用return this是想在入队时可以链式调用,简写代码达到偷懒的目的。

实现出队方法

function deQueue() {
    return this.data.shift()
}

实现访问队首方法

function first() {
    return this.data[0]
}

实现访问队尾方法

function last() {
    return this.data[this.data.length - 1]
}

实现显示队列元素方法

function toString() {
    var str = ''
    for (var i = 0; i < this.data.length; i++) {
        str += this.data[i] + '\n'
    }
    return str
}

之所以加上'\n',是想元素以这种格式显示:

first
second
three

实现队列是否为空的方法

function empty() {
    if (this.data.length === 0) {
        return true
    } else {
        return false
    }
}

队列实现完整代码

// Created by xiaoqiang on 07/04/2018.
function Queue() {
    this.data = []            // 存放数据
    this.enQueue = enQueue    // 入队操作
    this.deQueue = deQueue    // 出队操作
    this.first = first        // 访问第一个元素
    this.last = last          // 访问最后一个元素
    this.toString = toString  // 显示队列中的数据
    this.empty = empty        // 清空队列数据
}

function enQueue(param) {
    this.data.push(param)
    return this
}

function deQueue() {
    return this.data.shift()
}

function first() {
    return this.data[0]
}

function last() {
    return this.data[this.data.length - 1]
}

function toString() {
    var str = ''
    for (var i = 0; i < this.data.length; i++) {
        str += this.data[i] + '\n'
    }
    return str
}

function empty() {
    if (this.data.length === 0) {
        return true
    } else {
        return false
    }
}

测试及结果解释

测试用例

// 新建队列对象
var queue = new Queue()

// 入队操作
queue.enQueue('JavaScript').enQueue('Java').enQueue('NodeJS')

// 显示队列元素 
console.log(queue.toString())

// 出队操作
queue.deQueue()

// 显示队列元素
console.log(queue.toString())

// 访问队首元素
console.log(queue.first())

// 访问队尾元素
console.log(queue.last())

测试结果

将队列结构实现代码以及测试用例代码都放在queue.js文件中,使用
node queue.js 执行代码,运行结果如下:
这里写图片描述

结果解释

首先进行入队操作,由于本人在入队和出队中使用return this返回当前对象,因此可以链式调用,纯属偷懒做法。入队了三个元素,随后显示一下,如图,显示正确。
然后进行出队操作,即删除了第一个元素,如图,出队操作后显示正确。
最后访问了一下队首和队尾元素,此时只剩两个元素了,一个是队首一个是队尾,显示正确。
总结:JavaScript实现队列数据结构完成,逻辑正确。
有错误欢迎指出,下篇中将举一些应用此数据结构的实例,有兴趣欢迎阅读本人后续文章,谢谢。

猜你喜欢

转载自blog.csdn.net/fabulous1111/article/details/79846699