yocto-queue源码阅读

155 阅读2分钟

该类只有简单的几十行,非常容易

队列具有先进先出的特点

具体代码

步骤:

  1. 定义一个节点类,该节点具有value值和下一个指向两个属性
class Node {
    value;
    next;
    constructor(value){
        this.value = value
    }
}
  1. 定义队列类在队列类上创建头指针,尾指针,以及大小三个属性值。并且创建一系列方法,包括清空链表,增加新节点,删除当前节点以及依次获取队列的值
export default class Queue {
    #head;
    #tail;
    #size;
    constructor(){
        this.clear()
    }
    enqueue(value){
        let node = new Node(value);
        if(this.#head){
            this.#tail.next = node;
            this.#tail = node;
        }else {
            this.#head = node;
            this.#tail = node;
        }
        this.#size++
    }
    dequeue(){
        let currNode = this.#head
        if(currNode){
            this.#head = this.#head.next;
            this.#size--;
        }else {
            return;
        }
        return currNode.value;
    }

    clear(){
        this.#head = undefined;
        this.#tail = undefined;
        this.#size = 0;
    }
    get size(){
        return this.#size;
    }
}

然后再自定义一下迭代器方法,迭代器方法使用如下,

let myIterable = {};

myIterable[Symbol.iterator] = function*   {
    yield 1;
    yield 2;
    yield 3;
}
[...myIterable]; // [1,2,3]

let myIterable2 = {};
myIterable[Symbol.iterator] = function*   {
    let num = 3;
    while(num){
        yield 1;
        num--
    }
}
[...myIterable2]; // [1,1,1]

因此,在queue构造类上,添加以下代码

export default class Queue {
    ...
    * [Symbol.iterator](){
        let current = this.#head;
        while(current){
            yield current.value;
            current = current.next;
        }
    }
}

自动化测试

  1. 使用ava进行测试,在本地安装ava,然后编写测试用例test.js。注意ava需要在本地安装,测试用例在根路径,测试用例名称为test.js。ava对node版本有要求
  2. ava的使用与常见的测试工具相同,包括is,deepEqual等方法,ava简单,快速,适合简单的小项目
  3. 在package.json中添加测试脚本 "test": "ava " 或者执行npx ava或者npm test
import test from 'ava';
import Queue from './queue.js';

test('.enqueue', function(t) {
    console.log(t);
    const queue = new  Queue();
    queue.enqueue('hhhhh');
    t.is(queue.dequeue(),"hhhhh");
    queue.enqueue('abc');
    queue.enqueue('eee');
    t.is(queue.dequeue(),"abc");
    t.is(queue.dequeue(),"eee");
})
test('.dequeue', function(t) {
    const queue = new  Queue();
    t.is(queue.dequeue(),undefined);
    queue.enqueue('abc');
    queue.enqueue('eee');

    t.is(queue.dequeue(),"abc");
    t.is(queue.dequeue(),"eee");
    t.is(queue.dequeue(),undefined);
})

测试工具还有 mocha, tape, tap