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

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日

相关文章

  • Javascript Date prototype 属性

    JavaScript 中的 Date 对象是一个内置对象,它包含了一些有用的属性和方法,可以用于处理日期和时间。其中,Date.prototype 属性是一个对象,它允许您 Date 对象添加自定义属性和方法。在本教程中,我们将详细介绍 Date.prototype 属性的使用方法。 Date.prototype 属性的基本语法如下: Date.protot…

    JavaScript 2023年5月11日
    00
  • BootStrap智能表单demo示例详解

    下面是 “BootStrap智能表单demo示例详解” 的完整攻略: 前言 在前后端分离的项目中,表单是不可或缺的一部分。如何在前端中实现一个智能表单,可以提高用户的填写效率和体验,本文介绍了如何使用 Bootstrap 实现智能表单的演示示例。 准备工作 在开始之前,我们需要先引入 Bootstrap 和 jQuery 库。当然,您也可以使用 CDN 进行…

    JavaScript 2023年6月10日
    00
  • JS比较两个时间大小的简单示例代码

    JS比较两个时间大小可以通过将时间字符串转换为时间戳,然后将时间戳进行比较来实现。下面是实现的具体步骤: 第一步:将时间字符串转换为时间戳 使用JavaScript内置的Date对象可以将时间字符串转换为时间戳,方法是调用getTime()函数,它将返回当前日期对象表示的时间与UTC时间1970年1月1日午夜之间相差的毫秒数。 示例代码: let dateS…

    JavaScript 2023年5月27日
    00
  • 详解vue的hash跳转原理

    下面我将详细讲解“详解Vue的Hash跳转原理”的完整攻略。 什么是Hash路由 Hash路由是现代前端路由中最早出现的一种路由模式。它利用URL中的#字符来实现页面跳转而无需刷新页面。由于Hash前的URL部分不会发送到服务器,所以可以避免页面的重载,比较适合单页应用的开发。 Hash路由原理 在Hash路由模式下,我们使用JavaScript操作URL中…

    JavaScript 2023年6月11日
    00
  • javascript中的几个运算符

    下面是Javascript中的几个运算符的详细讲解。 算术运算符 算术运算符是用来执行数学运算的运算符。Javascript中包含了基础的加、减、乘、除、求余运算符。 var x = 10; var y = 3; console.log(x + y); // 13 console.log(x – y); // 7 console.log(x * y); //…

    JavaScript 2023年5月18日
    00
  • Servlet3.0与纯javascript通过Ajax交互的实例详解

    Servlet 3.0 与纯 JavaScript 通过 Ajax 交互的实例详解 1. Ajax 简介 Asynchronous JavaScript and XML(异步 JavaScript 和 XML),简称 Ajax,是一种创建快速动态网页的技术,在不重新加载整个网页的情况下,实现部分页面的更新。Ajax 是一种使用现代 Web 技术的方法,能够更…

    JavaScript 2023年6月11日
    00
  • 用javascript实现的不错的一款网页选项卡

    实现网页选项卡可以分为以下步骤: HTML结构 首先,在HTML文件中创建一个选项卡容器div,并在其中创建与选项卡对应的多个div,每个div代表一个选项卡卡片。还需要添加一个列表ul,每个列表项li对应一个选项卡。 <div class="tab-container"> <ul class="tab-nav…

    JavaScript 2023年6月10日
    00
  • js下用gb2312编码解码实现方法

    实现 JS 下使用 GB2312 编码解码的方法主要有两种,分别是通过 iconv-lite 库和手动实现 GB2312 编码解码算法。 方式一:使用 iconv-lite 库 首先需要安装 iconv-lite 库,运行以下命令: bash npm install iconv-lite 使用 iconv-lite 库的 encode 函数将字符串进行 GB…

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