JavaScript数据结构yocto queue队列链表代码分析
什么是队列?
队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。
队列的实现方式
队列在程序中有多种不同的实现方式,常见方法包括数组实现、链表实现等。下面,我们着重学习链表实现方式。
队列使用链表实现
JavaScript中可以使用链表来实现队列结构,此时我们将队列头称为队头(front),将队列尾称为队尾(rear)。通过链表可以实现队列的插入操作与删除操作,具体插入和删除操作如下:
插入(入队)
- 创建一个新的节点
- 将该节点添加至队列尾(rear)
- 如果该节点是队列中第一个节点,则同时将其设置为队头(front)
- 返回成功添加节点后队列中节点的个数
删除(出队)
- 从队列头(front)删除一个节点
- 如果队列中只有一个节点,则同时删除该节点,且设置队头和队尾均为空
- 返回成功删除节点后队列中节点的个数
yocto-queue 队列代码分析
yocto-queue是一个开源的npm包,用于JavaScript实现队列。我们通过分析该库的源代码,掌握如何使用链表实现队列的基本操作。
初始化
在源代码的 constructor
函数中,我们可以看到首先定义了两个 null 值来分别代表链表的头指针与尾指针:
constructor () {
this._front = null;
this._rear = null;
}
入队
enqueue
函数用于在队列的尾部添加新元素:
enqueue (data) {
if (!this._front) {
this._front = this._rear = { data, next:null };
} else {
this._rear = this._rear.next = { data, next:null };
}
this._size++;
return this._size;
}
从上述代码中可知,如果队列为空,该函数会将新元素设为队列头和队列尾。反之,将新元素加入队列尾,同时更新队列尾指针和队列大小。最后返回队列大小。
出队
dequeue
函数用于删除队列前端的元素:
dequeue () {
let res = null;
if (this._front) {
this._size--;
res = this._front;
this._front = this._front.next;
if (!this._front) {
this._rear = null;
}
}
return res ? res.data : null;
}
从上述代码中可知,如果队头不为空,则删除队头元素并将其返回。同时将队头指向下一个元素,并更新队列大小。然而需要注意的是,如果队列中仅剩下一个元素,则删除该元素后,同时要将队列头和队列尾都设为 null,即空队列。
示例说明
下面的示例演示了如何使用 yocto-queue
包来实现将珂朵莉树从根节点开始按层遍历输出:
const YoctoQueue = require('yocto-queue');
function levelOrderTraversal (root) {
const queue = new YoctoQueue();
queue.enqueue(root);
let resStr = '';
while (queue.size() > 0) {
const node = queue.dequeue();
resStr += `${node.val} `;
if (node.left) {
queue.enqueue(node.left);
}
if (node.right) {
queue.enqueue(node.right);
}
}
console.log(resStr);
}
const tree = {
val: 1,
left: {
val: 2,
left: { val: 4, left: null, right: null },
right: { val: 5, left: null, right: null },
},
right: {
val: 3,
left: { val: 6, left: null, right: null },
right: { val: 7, left: null, right: null },
}
};
levelOrderTraversal(tree); // 输出:1 2 3 4 5 6 7
上面的示例使用了 yocto-queue
包来实现二叉树的按层遍历操作。具体分析如下:
- 首先,创建一个 YoctoQueue 的实例命名为
queue
- 将二叉树的根节点
root
入队 - 创建一个字符串变量
resStr
,用于存储遍历结果 - 当队列不为空时,依次将队列中节点出队,并将节点值
node.val
存入resStr
- 如果节点
node
存在左子树,则将左子树节点入队 - 如果节点
node
存在右子树,则将右子树节点入队 - 最后输出
resStr
,即为按层遍历结果
还可使用 yocto-queue
包实现更多操作,例如最大队列长度、队列是否为空等等。具体情况可以阅读该包的官方文档。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构yocto queue队列链表代码分析 - Python技术站