数据结构--队列

一、认识队列

队列(Queue)是一种 受限的线性数据结构,具有 先进先出(FIFO,First In First Out)的特点。

受限之处:

  • 只允许在表的前端(front)进行删除操作。
  • 只允许在表的后端(rear)进行插入操作。

我们可以将队列的特点与生活中的一些场景进行类比:

生活中类似队列结构的场景:

  • 排队:在电影院、商场或者排队购票、结账、使用厕所等场合,人们按照先来后到的顺序排队等待。当有人完成任务或离开时,排在前面的人先得到处理,后面的人依次顺延。
  • 优先处理:有时候在队列中可能存在一些特殊情况,例如有一些人拥有特权或优先级较高,可以优先得到处理。这类似于某些特定情况下,例如VIP顾客或急诊患者在排队过程中可以被提前处理。

图解队列:
在这里插入图片描述

队列作为一种常见的数据结构,具有广泛的应用。它在计算机科学和软件开发中有着重要的角色,用于解决各种问题,例如任务调度、缓冲区管理、广度优先搜索等。

通过理解队列的特性和场景,我们可以更好地应用队列数据结构来解决实际问题,并提高处理效率。

二、队列的实现

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

  /**
   * 入队
   * @param {*} value
   */
  enqueue(value) {
    this.items.push(value);
  }

  /**
   * 出队
   * @returns 返回出队的元素
   */
  dequeue() {
    return this.items.shift();
  }

  /**
   * 判断队列是否为空
   * @returns
   */
  isEmpty() {
    return this.items.length === 0;
  }

  /**
   * 返回队头元素
   * @returns
   */
  front() {
    if (this.isEmpty()) return null;
    return this.items[0];
  }

  /**
   * 清空队列
   */
  clear() {
    this.items = [];
  }

  /**
   * 返回队列的大小
   * @returns
   */
  size() {
    return this.items.length;
  }
}

三、队列的应用

1. 击鼓传花

使用队列实现小游戏:击鼓传花

分析:传入一组数据集合和设定的数字 number,循环遍历数组内元素,遍历到的元素为指定数字 number 时将该元素删除,直至数组剩下一个元素。

function passGame(nameList, num) {
  // 1. 创建一个队列
  const queue = new Queue();

  // 2. 将 nameList 里面的每一个元素一次加入到队列中
  for (const name of nameList) {
    queue.enqueue(name);
  }

  // 3. 开始数数:队列中只剩下 1 个元素时就停止数数
  while (queue.size() > 1) {
    // 不是 num 时,重新加入到队列的末尾
    // 是 num 时,将其删除
    for (let i = 0; i < num - 1; i++) {
      queue.enqueue(queue.dequeue());
    }
    // num 对应这个人,直接从队列中删除
    queue.dequeue();
  }

  // 4. 获取剩下的那个人
  return queue.front();
}
console.log('击鼓传花:'', passGame(['A', 'B', 'C', 'D', 'E'], 3));
// 击鼓传花: D

四、优先级队列

1. 场景

生活中类似 优先队列 的场景:有时候在队列中可能存在一些特殊情况,例如有一些人拥有特权或优先级较高,可以优先得到处理。这类似于某些特定情况下,例如VIP顾客或急诊患者在排队过程中可以被提前处理。

2. 特点

  • 我们知道,普通的队列插入一个元素,数据会被放在后端,并且需要前面所有的元素都处理完成后才会处理前面的数据。
  • 但是优先级队列,在插入一个元素的时候会考虑该数据的优先级
  • 和其他数据优先级进行 比较
  • 比较完成后,可以得出这个元素在队列中正确的位置。
  • 其他处理方式,和基本队列的处理方式一样。

3. 代码实现

class PriorityQueue extends Queue {
  /**
   * 重写入队方法
   * @param {*} value 元素
   * @param {*} priority 优先级
   */
  enqueue(value, priority) {
    // 1. 创建入队元素
    const element = { value, priority };
    // 2. 根据优先级插入到合适的位置
    let inserted = false;
    for (let i = 0; i < this.items.length; i++) {
      const item = this.items[i];
      if (priority > item.priority) {
        this.items.splice(i, 0, element);
        inserted = true;
        break;
      }
    }
    // 3. 如果优先级最低,则插入到队尾
    if (!inserted) {
      this.items.push(element);
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/614950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

乡村振兴与乡村振兴战略的深度融合:落实乡村振兴战略,推动乡村全面发展,打造富强民主文明和谐美丽的社会主义现代化新农村

一、引言 在全面建设社会主义现代化国家的新征程中&#xff0c;乡村振兴战略承载着推动乡村全面发展、实现农业农村现代化的重大使命。乡村振兴战略的实施&#xff0c;不仅关系到亿万农民的福祉&#xff0c;也关系到国家整体发展的质量和水平。因此&#xff0c;深化乡村振兴与…

YOLOv8项目使用说明

1. 下载群公告中的百度云连接&#xff0c;得到一个压缩文件 2. 解压并使用相关软件&#xff08;如pycharm、VSCode等&#xff09;打开 3. 选择一个合适的模型yaml文件&#xff0c;及数据集yaml文件进行训练 4. 配置并填入数据集yaml文件 5. 运行即可

MyCat实现分库分表

两个集群 两个库 两个表 搭建数据库服务使用docker启动两个mysql 3506 3507连接MyCat创建两个数据源连接MyCat创建集群 mycat创建逻辑库MyCat创建全局表广播表创建分片表mycat逻辑库MyCat插入数据mycat查看数据物理库3506查看数据物理库3507查看数据 ER表创建ER表mycat插入数据…

【Linux:lesson1】的基本指令

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;打开Xshell&#xff0c;登陆root…

Python | Leetcode Python题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution:def minWindow(self, s: str, t: str) -> str:ans_left, ans_right -1, len(s)left 0cnt_s Counter() # s 子串字母的出现次数cnt_t Counter(t) # t 中字母的出现次数less len(cnt_t) # 有 less 种字母的出现次数…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性&#xff1a; Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;具有许多强大的特性。以下是一些主要的 Vue 特性&#xff1a; 响应式数据&#xff1a;Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时&#xff0c;视图会自…

系统重构思路

系统重构之道 现在是进行重构的恰当时机吗&#xff1f;重构前需要做什么准备&#xff1f;如何保障重构工作顺利完成并达成预期目标&#xff1f;从这几个大家都关心的问题&#xff0c;来谈谈重构工作遵循的基本思路和原则。 从实际问题出发 “不能解决实际问题的重构就是耍流…

详解:ic网站建设开发需要注意什么?

IC网站建设开发需注重专业内容的呈现、强大的产品检索功能、全面的技术支持、严格的合规性展示、便捷的采购工具、良好的用户账户管理、移动适应性和多语言支持&#xff0c;以及高性能与高安全性&#xff0c;以满足行业用户的专业需求&#xff0c;提升网站的实用性和吸引力。 …

winhex工具,将文件转换为16进制数据放入代码。

今天介绍winhex工具&#xff0c;可以将任何内容读取读取为16进制数据。下面看下效果。 下载链接&#xff1a; WinHex: Hex Editor & Disk Editor, Computer Forensics & Data Recovery Software 一、WinHex打开文件 我们要打开的文件&#xff1a; 打开后&#xff1a; 我…

数据结构--单链表 详解(附代码

目录&#xff1a; 1&#xff1a;链表的概念及结构 2&#xff1a;实现单链表 3&#xff1a;常见疑问 解答 &#xff08;看到最后&#xff01;&#xff01;&#xff09; 一&#xff1a;链表的概念及结构 1.1 概念&#xff1a; 链表是⼀种 物理存储结构上非连续、非顺序的 存储结…

Qt | QSpinBox 类 QDoubleSpinBox 类(微调框)

01、QSpinBox 类 1、QSpinBox类是 QAbstractSpinBox 类的直接子类和具体实现, 2、QSpinBox 类被设计用于处理整数和离散值集合,对于浮点值使用 QDoubleSpinBox 类实现。 3、QSpinBox 默认只支持整数值,但可通过其内部的成员函数进行扩展,以支持使用不同的 字符串。 02…

Web数字孪生引擎

Web数字孪生引擎是指用于在Web上创建和运行数字孪生的软件平台。它们通常提供一组API和工具&#xff0c;用于连接到实时数据源、可视化数据并创建交互式体验。Web数字孪生引擎被广泛应用于各种应用&#xff0c;例如工业物联网、智能建筑、城市管理和公共安全等。北京木奇移动技…

stata空间计量模型基础+检验命令LM检验、sem、门槛+arcgis画图

目录 怎么安装stata命令 3怎么使用已有的数据 4数据编辑器中查看数据 4怎么删除不要的列 4直接将字符型变量转化为数值型的命令 4改变字符长度 4描述分析 4取对数 5相关性分析 5单位根检验 5权重矩阵标准化 6计算泰尔指数 6做核密度图 7Moran’s I 指数 8空间计量模型 9LM检验…

基于Huffman编码的字符串统计及WPL计算

一、问题描述 问题概括&#xff1a; 给定一个字符串或文件&#xff0c;基于Huffman编码方法&#xff0c;实现以下功能&#xff1a; 1.统计每个字符的频率。 2.输出每个字符的Huffman编码。 3.计算并输出WPL&#xff08;加权路径长度&#xff09;。 这个问题要求对Huffman编码算…

在 Kubernetes 上运行 Apache Spark 进行大规模数据处理的实践

在刚刚结束的 Kubernetes Community Day 上海站&#xff0c;亚马逊云科技在云原生分论坛分享的“在 Kunernets 上运行 Apache Spark 进行大规模数据处理实践”引起了现场参与者的关注。开发者告诉我们&#xff0c;为了充分利用 Kubernetes 的高可用设计、弹性&#xff0c;在越来…

FFmpeg常用API与示例(四)——过滤器实战

1.filter 在多媒体处理中&#xff0c;filter 的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如&#xff1a;视频翻转&#xff0c;旋转&#xff0c;缩放等。 语法&#xff1a;[input_link_label1]… filter_nameparameters [output_link_label1]… 1、视…

凸优化理论学习二|凸函数及其相关概念

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 文章目录 系列文章目录一、凸函数&#xff08;一&#xff09;凸集&#xff08;二&#xff09;凸函数的定义及举例&#xff08;三&#xff09;凸函数的证明1、将凸函数限制在一条直线上2、判断函数是否为凸函数的一阶条件…

[每周一更]-(第96期):Rsync 用法教程:高效同步文件与目录

文章目录 一、引言二、rsync 基本概念三、介绍rsync 是什么&#xff1f;四、安装五、rsync 基本语法常见示例&#xff08;默认ssh协议&#xff09;&#xff1a; 六、常用选项1. -a 或 --archive2. -v 或 --verbose3. -z 或 --compress4. --delete5. --exclude6. --exclude-from…

VR全景技术在养老院的应用优势浅析

随着时代的快速发展&#xff0c;人口老龄化越来越严重&#xff0c;如何利用VR技术提升养老服务的质量&#xff0c;成为了社会各界关注的焦点。为养老院拍摄制作VR全景&#xff0c;不仅能够为养老院的老人子女们跨越空间限制&#xff0c;实现与家人的情感连接&#xff0c;还可以…