操作 学习JavaScript数据结构与算法(第3版)阅读笔记---第5章

5.1 队列数据结构

队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新 元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
在现实中,最常见的队列的例子就是排队。

5.1.1 创建队列

创建自己的类来表示一个队列。

class Queue { 
    constructor() { 
        this.count = 0; // {1} 
        this.lowestCount = 0; // {2} 
        this.items = {}; // {3} 
    } 
}

使用一个对象来存储我们队列中的元素(行{3})。
声明一个 count 属性来帮助我们控制队列的大小(行{1})。
声明一个 lowestCount 变量(行{2})来帮助我们追踪第一个元素,方便从队 列前端移除元素。
接下来需要声明一些队列可用的方法。
enqueue(element(s)):向队列尾部添加一个(或多个)新的项。
dequeue():移除队列的第一项(即排在队列最前面的项)并返回被移除的元素。
peek():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息)。
isEmpty():如果队列中不包含任何元素,返回 true,否则返回 false。
size():返回队列包含的元素个数,与数组的 length 属性类似。

1. 向队列添加元素

实现enqueue 方法。该方法负责向队列添加新元素,是新的项只能添加到队列末尾。

enqueue(element) { 
    this.items[this.count] = element; 
    this.count++; 
}

向队列中加入一个元素的话,我们要把 count 变量作为 items对象中的键,对应的元素作为它的值。将元素加入队列后,我们将 count 变量加 1。

2. 从队列移除元素

实现 dequeue 方法,该方法负责从队列移除项。由于队列遵循先进先出原则,最 先添加的项也是最先被移除的。

dequeue() {
    if (this.isEmpty()) { 
        return undefined; 
    } 
    const result = this.items[this.lowestCount]; // {1} 
    delete this.items[this.lowestCount]; // {2} 
    this.lowestCount++; // {3} 
    return result; // {4}
}

首先检验队列是否为空。如果为空,返回 undefined 值。如果队列不为空, 暂存队列头部的值(行{1}),以便该元素被移除后(行{2})将它返回(行{4})。将 lowestCount 属性加 1(行{2}。
用下面的内部值来模拟 dequeue 动作。

items = { 
    0: 5, 
    1: 8 
}; 
count = 2; 
lowestCount = 0;

将键设为 0 来获取队列头部的元素(第一个被添加的元素是 5),删除它,再返回它的值。在这种场景下,删除第一个元素后,items 属性将只会包含一个元素(1∶8)。再次执 行 dequeue 方法的话,它将被移除。因此我们将 lowestCount 变量从 0 修改为 1。

猜你喜欢

转载自www.cnblogs.com/donokamark/p/12690551.html
今日推荐