- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第32期,链接:队列链表
该类只有简单的几十行,非常容易
队列具有先进先出的特点
具体代码
步骤:
- 定义一个节点类,该节点具有value值和下一个指向两个属性
class Node {
value;
next;
constructor(value){
this.value = value
}
}
- 定义队列类在队列类上创建头指针,尾指针,以及大小三个属性值。并且创建一系列方法,包括清空链表,增加新节点,删除当前节点以及依次获取队列的值
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;
}
}
}
自动化测试
- 使用ava进行测试,在本地安装ava,然后编写测试用例test.js。注意ava需要在本地安装,测试用例在根路径,测试用例名称为test.js。ava对node版本有要求
- ava的使用与常见的测试工具相同,包括is,deepEqual等方法,ava简单,快速,适合简单的小项目
- 在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等