JS数据结构与算法-队列

简介: 定义队列是遵循FIFO(First In First Out,先进先出)原则的一组有序的项。在现实中,最常见的队列的例子就是排队:来自《javascript数据结构与算法》创建队列声明类并声明一个数组用于存储队列中元素的数据结构。
  1. 定义

队列是遵循FIFO(First In First Out,先进先出)原则的一组有序的项。

在现实中,最常见的队列的例子就是排队:

img_8fcc8f5a56db6aa7d2a205ee63c02eca.png
来自《javascript数据结构与算法》
  1. 创建队列
  • 声明类并声明一个数组用于存储队列中元素的数据结构。
function Queue() {
  var items = [];
  //这里是属性和方法
}
AI 代码解读
  • 实现enqueue()方法,向队列尾部添加数个新的项。
this.enqueue = function(element) {
  //用push方法,将元素添加到数组末尾
  items.push(element);
};
AI 代码解读
  • 实现dequeue()方法,移除队的第一项(队首),并返回被移除的元素。
this.dequeue = function() {
  //shift方法,移除数组中的第一项(索引为0)的元素
  return items.shift();
};
AI 代码解读
  • front()方法,返回队列中的第一个元素,不改变队列。
this.front = function() {
  return items.shift();
};
AI 代码解读
  • isEmpty()方法,如果队列中不包含任何元素,返回true,否则返回false。
this.isEmpty = function() {
  return items.length == 0;
};
AI 代码解读
  • clear()方法,清空队列元素
this.clear = function() {
  items = [];
};
AI 代码解读
  • size()方法,返回队列包含的元素个数。
this.size = function(){
  return items.lenght;
};
AI 代码解读
  • 完整代码如下
function Queue() {
  var items = [];

  this.enqueue = function(element) {
    items.push(element);
  };

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

  this.front = function() {
    return items[0];
  };

  this.isEmpty = function() {
    return items.length == 0;
  };

  this.clear = function() {
    items = [];
  };

  this.size = function() {
    return items.length;
  };

  this.print = function() {
    console.log(items.toString());
  }
}

var queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);

queue.print(); // "1,2"
AI 代码解读
  1. 优先队列
    现实生活中也有优先队列,如头等舱>商务舱>经济舱,接下来我们用代码实现下优先队列。
function PriorityQueue() {
  //声明一个items用于保存元素
  var items = [];

  //创建一个QueueElement类,用于保存元素和其在队列中的优先级(priority越小,优先级越高)
  function QueueElement(element,priority) {
    this.element = element;
    this.priority = priority;
  }

  this.enqueue = function(element,priority) {
    var queueElement = new QueueElement(element,priority);
    //如果队列为空,可以将元素入列
    if(this.isEmpty()) {
      items.push(queueElement);
    }else {
      var added = false;
      //反之就循环队列里面的每一个元素,比较优先级,如果priority小(优先级越高)的话,就用splice()方法放在该元素的前面
      for(var i=0; i<items.length; i++) {
        if(queueElement.priority < items[i].priority) {
          items.splice(i,0,queueElement);
          added = true;
          break;
        }
      }
      //如果添加的元素的priority比队列中的每一个元素都要大的话,就把它添加到队列的最后面
      if(!added) {
        items.push(queueElement);
      }
    }
  };

  this.isEmpty = function() {
    return items.length === 0;
  };

  this.print = function() {
    console.log(items);
  };
}

var priorityQueue = new PriorityQueue();
priorityQueue.enqueue("one",1);
priorityQueue.enqueue("two",2);
priorityQueue.enqueue("zero",0);
priorityQueue.enqueue("four",4);

priorityQueue.print(); // "0,1,2,4"
AI 代码解读
  1. 循环队列
    循环队列的一个例子就是击鼓传花游戏(HotPotato)。在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人。某一时刻传花停止,这个时候花在谁手里,谁就退出圆圈结束游戏。重复这个过程,直到只剩一个孩子(胜者)。
function hotPotato(nameList,num) {
  var queue = new Queue();

  //将传入的nameList遍历,将每一项添加到队列中
  for(var i=0; i<nameList; i++) {
    queue.enqueue(nameList[i]);
  }

  var eliminated = '';
  //如果队列里的size大于1,就一直循环下去
  while(queue.size() > 1) {
    //将第一项放到最后一项,循环给定的num
    for(var i=0; i<num; i++) {
      queue.enqueue(queue.dequeue);
    }
    //传递次数达到了给定的数值,(移除第一项)
    eliminated = queue.dequeue();
    console.log(eliminated + '淘汰');
  }
  //返回队列中仅有的最后一项
  return queue.dequeue();
}

var names = ['a','b','c','d','e'];
var winner = hotPotato(names,7);
console.log('胜利者' + winner);
AI 代码解读

参考学习

《javascript数据结构与算法学习》
《数据结构与算法javascript描述》

目录
打赏
0
0
0
0
13
分享
相关文章
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
104 1
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
82 11
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
59 4
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
74 3
公司内部网络监控中的二叉搜索树算法:基于 Node.js 的实时设备状态管理
在数字化办公生态系统中,公司内部网络监控已成为企业信息安全管理体系的核心构成要素。随着局域网内终端设备数量呈指数级增长,实现设备状态的实时追踪与异常节点的快速定位,已成为亟待解决的关键技术难题。传统线性数据结构在处理动态更新的设备信息时,存在检索效率低下的固有缺陷;而树形数据结构因其天然的分层特性与高效的检索机制,逐渐成为网络监控领域的研究热点。本文以二叉搜索树(Binary Search Tree, BST)作为研究对象,系统探讨其在公司内部网络监控场景中的应用机制,并基于 Node.js 平台构建一套具备实时更新与快速查询功能的设备状态管理算法框架。
49 3
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
66 2
Javascript常见算法详解
本文介绍了几种常见的JavaScript算法,包括排序、搜索、递归和图算法。每种算法都提供了详细的代码示例和解释。通过理解这些算法,你可以在实际项目中有效地解决各种数据处理和分析问题。
132 21
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
64 6
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问