JS中的算法与数据结构之队列(Queue)实例详解

yizhihongxing

JS中的算法与数据结构之队列(Queue)实例详解

什么是队列?

队列是一种线性数据结构,它是一种先进先出的数据结构(FIFO),即最先进队列的元素也最先出队列。

队列有两个基本操作:入队和出队。入队将元素添加到队列的末尾,而出队则是从队列的前端删除元素。

队列的实现方式

我们可以用数组和链表来实现队列,这里我们介绍一下使用数组来实现队列的方式。

用数组实现队列

我们可以在数组的末尾添加元素,从数组头部删除元素。当元素出队列时,我们可以将数组的第一个元素删除。这个过程可以用 shift 方法来实现,而入队操作可以使用 push 方法来往数组的末尾添加元素。

下面是一个使用数组实现队列的示例:

class Queue {
  constructor() {
    this.items = [];
  }

  enqueue(item) {
    this.items.push(item);
  }

  dequeue() {
    return this.items.shift();
  }
}

以上代码中,我们定义了一个 Queue 类作为队列的实现,该类的构造函数里定义了一个 items 数组,这个数组存储着队列的元素。

我们使用 enqueue 方法将元素添加到数组的末尾,使用 dequeue 方法从数组的头部删除元素。

用链表实现队列

链表与数组不同,它们没有固定的大小。我们可以使用一个包含 valuenext 属性的节点来实现链表队列。

下面是一个使用链表实现队列的示例:

class QueueNode {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  enqueue(item) {
    const node = new QueueNode(item);

    if (this.tail) {
      this.tail.next = node;
    } else {
      this.head = node;
    }

    this.tail = node;
    this.length++;
  }

  dequeue() {
    if (!this.head) return null;

    const item = this.head.value;

    if (this.head === this.tail) {
      this.tail = null;
    }

    this.head = this.head.next;
    this.length--;

    return item;
  }
}

以上代码中,我们定义了 QueueNode 类作为队列链表节点的实现,该类包含 valuenext 属性,分别对应节点的值和下一个节点。

Queue 类定义了队列链表的实现,其中的 headtail 属性分别表示队列的头节点和尾节点。我们使用 enqueue 方法向队列中添加元素,使用 dequeue 方法从队列中删除元素。

队列的应用场景

队列广泛应用于计算机科学和实际生活中诸如广告投放、大数据处理和操作系统等领域。以下是两种队列的应用场景的示例。

打印队列

考虑一个使用打印机的场景。多个人可以向打印队列中提交打印任务,队列会逐个打印所有的任务。这时我们可以使用队列来实现打印任务的队列,先进先出。

class PrintQueue {
  constructor() {
    this.queue = new Queue();
    this.timer = null;
    this.delay = 5000;
  }

  enqueue(item) {
    this.queue.enqueue(item);

    if (!this.timer) {
      this.timer = setTimeout(() => this.print(), this.delay);
    }
  }

  dequeue() {
    return this.queue.dequeue();
  }

  print() {
    if (!this.queue.length) {
      clearTimeout(this.timer);
      this.timer = null;
    } else {
      const item = this.queue.dequeue();
      console.log(`Printing ${item}...`);
      setTimeout(() => this.print(), this.delay);
    }
  }
}

const printQueue = new PrintQueue();
printQueue.enqueue("Document A");
printQueue.enqueue("Document B");

以上代码中,我们定义了一个 PrintQueue 类作为打印队列的实现,该类包含了一个队列和一个打印计时器。进入队列的任务将以先进先出的方式进行打印。

更长时间的排队队列

在很多场景中,用户在排队时可能需要等待较长时间。这里我们可以使用队列来管理排队用户。当排队人数超过一个给定的限制时,我们可以向队列中添加一个状态为等待的用户。当一个用户完成服务时,我们可以处于等待状态的用户中取出一个进行服务。

class WaitQueue {
  constructor(limit) {
    this.queue = new Queue();
    this.limit = limit;
  }

  push(item) {
    if (this.queue.length >= this.limit) return false;

    this.queue.enqueue(item);
    return true;
  }

  pop() {
    return this.queue.dequeue();
  }
}

const waitQueue = new WaitQueue(3);
waitQueue.push("User A");
waitQueue.push("User B");
waitQueue.push("User C");
waitQueue.push("User D"); // 队列已满,无法添加

console.log(waitQueue.pop()); // User A
console.log(waitQueue.pop()); // User B
console.log(waitQueue.pop()); // User C

以上代码中,我们定义了一个 WaitQueue 类作为排队队列的实现,该类有一个 limit 属性限制该队列长度。可以使用 push 方法向队列中添加元素,当队列已满时,将无法添加新元素。可以使用 pop 方法从队列中删除元素,这个队列遵循先进先出的原则。

总结

队列是一种先进先出的线性数据结构,适合于任务管理和排队等业务场景。在 JavaScript 中,我们可以使用数组或链表来实现队列。

以上是我对“JS中的算法与数据结构之队列(Queue)实例详解”的完整攻略,包括队列的实现方式、应用场景和示例说明。感谢阅读!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中的算法与数据结构之队列(Queue)实例详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 浅析JS中document对象的一些重要属性

    下面是关于“浅析JS中document对象的一些重要属性”的完整攻略: 一、什么是document对象 document对象代表当前HTML文档,是网页与JavaScript交互的关键。我们可以通过document对象来获取并操纵HTML元素,实现网页的动态效果。 二、 document对象的一些重要属性 1. document.title document…

    JavaScript 2023年6月10日
    00
  • javascript制作幻灯片(360度全景图片)

    准备工作 在制作幻灯片之前,我们需要准备以下几个工作: HTML页面模板 360度全景图片 JavaScript库Three.js 其中,HTML页面模板是整个幻灯片的基础,而360度全景图片是幻灯片展示的内容,而JavaScript库Three.js是帮助我们实现幻灯片效果的工具。 引入Three.js库 首先需要在HTML页面中引入Three.js库,具…

    JavaScript 2023年6月11日
    00
  • Javascript Date setUTCMonth() 方法

    以下是关于JavaScript Date对象的setUTCMonth()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setUTCMonth()方法 JavaScript的setUTCMonth()方法设置对象UTC月份部分。方法接受一个整数,表示要设置的UTC月份如果该参数超出了JavaScript所能表示的范围,则自动调整为相应…

    JavaScript 2023年5月11日
    00
  • 浅析js中substring和substr的方法

    浅析JS中substring和substr的方法 在JavaScript中, substring 和 substr 是两个常用的字符串方法,用于截取字符串的一部分并返回。但是它们的不同之处在于它们的使用方式和截取字符串的方式。下面我们来浅析一下它们的使用方法及区别。 一、substring方法 1.1 方法定义 substring(startIndex, e…

    JavaScript 2023年6月10日
    00
  • JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法

    当我们需要给同一DOM元素绑定onClick事件和onDblClick事件时,我们会发现这两个事件会产生冲突,无法同时生效。那么该如何解决呢?下面是完整攻略: 1. 解决方法 我们可以通过以下两种方式实现同一DOM元素上onClick事件与onDblClick事件并存: 1.1. 使用setTimeout 我们可以通过使用setTimeout函数来延迟执行o…

    JavaScript 2023年6月10日
    00
  • jquery+ajax实现注册实时验证实例详解

    下面是我对于“jquery+ajax实现注册实时验证实例详解”的完整攻略: 1. 基本概念 在进行 jquery+ajax 实现注册实时验证的过程中,我们需要先了解以下几个基本概念: jQuery:一种常用的 JavaScript 库,拥有许多实用函数和方法,方便我们编写 JavaScript 代码。 Ajax:一种网页编程技术,通过异步请求获取数据而不需要…

    JavaScript 2023年6月10日
    00
  • js插件方式打开pdf文件(浏览器pdf插件分享)

    下面是关于“js插件方式打开pdf文件(浏览器pdf插件分享)”的完整攻略: 1. 准备工作 在实现该功能前,需要将需要打开的pdf文件上传到服务器,并记住该文件的访问地址。 2. 确认浏览器是否支持pdf插件 首先,需要确认当前浏览器是否提供了自带的pdf插件或者是否安装了第三方的pdf插件。 可以让用户打开一个测试页面,例如: <!DOCTYPE …

    JavaScript 2023年5月27日
    00
  • JS函数的定义与调用方法推荐

    我们来详细讲解一下“JS函数的定义与调用方法推荐”的完整攻略。 定义函数 定义一个函数可以用如下的语法: function functionName(parameter1, parameter2, … , parameterN) { // 函数体 } 其中 functionName 是函数名称,parameter1 到 parameterN 是函数的形参…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部