java先进先出 循环队列,JavaScript队列、优先队列与循环队列

队列是一种遵从先进先出(FIFO)原则的有序集合

队列在尾部添加新元素,从顶部移除元素

队列的理解

队列在我们生活中最常见的场景就是排队了

队列这个名字也已经很通俗易懂了

b1aeae3c9c60dfae3bb77274f45fc7e3.png

和栈很像,这不过队列是先入先出的数据结构

f681764acf92d5192a5a3182c3b2b979.png

队列的前面是队头

队列的后面是队尾

出队从队头出

入队从队尾入

队列的创建

和栈类似,这里我就不就不啰嗦了

同样需要实现一些功能

这里我类比生活中的排队上厕所

向队列中添加元素(进入排队的队伍中)

移除队头元素(队伍最前面的人出队进入厕所)

查看队头元素(查看队伍最前面的人)

判断队列是否为空(看看队伍中有没有人)

移除队伍全部元素(厕所炸了,都散了吧)

查看栈里元素个数(查看排队的有多少人)

于是我们可以创建一个完整队列实现,同样是利用我们的数组实现

数组头就是队列头

function Queue() {

var items = [];

this.enqueue = function (ele) {

items.push(ele);

};//入队

this.dequeue = function () {

return items.shift();

};//出队

this.front = function () {

return items[0];

};//查看队头元素

this.isEmpty = function () {

return items.length === 0;

};//判断队列是否为空

this.size = function () {

return items.length;

};//队列大小

this.clear = function () {

items = [];

};//清空队列

this.print = function () {

console.log(items.toString());

};//打印队列

}

var queue = new Queue(); //声明队列的实例

队列的使用

下面我们就用这个队列简单模拟排队

var queue = new Queue();

console.log("队列是否为空: " + queue.isEmpty());

queue.enqueue('Mr.A');

queue.enqueue('Mr.B');

queue.enqueue('Mr.C');

console.log("当前队列:");

queue.print();

console.log("出队的人: " + queue.dequeue());

console.log("当前队列:");

queue.print();

控制台打印:

6316ed74e46f123597f03ba09f138584.png

优先队列

在我们排队上厕所的时候,来了一位拥有VIP会员卡的朋友,插到了队伍的最前面

过了一会儿又来了一位拥有SVIP会员卡的朋友,插到了VIP的前面

虽然这个比喻可能不恰当,但是生活中可能存在有优先级的队列

优先级高的人可以查到优先级低的人前面

这就是循环队列

如果优先值小的元素放到队列的前面,这叫做最小优先队列反之优先值大的元素放到队列的前面,这叫做最大优先队列但其实他们两个仅仅是一个判断的改变,实现方式是一样的

优先队列较普通队列的区别也就是入队要判断优先级,并且需要对我们的元素进行处理,其他方法不变

这处理也就是把元素包装为一个拥有优先级的对象

既然所有对象都有着同样的属性,那我们毫无疑问就应该使用工厂构建

我们可以稍微修改一下我们的队列类

来实现一个最小优先队列

function PriorityQueue() {

var items = [];

function QueEle(ele, priority){ //封装我们的元素为一个对象

this.ele = ele; //元素

this.priority = priority; //优先级

}

this.enqueue = function (ele, priority) {

var queObj = new QueEle(ele, priority); //创建队列元素对象

if(this.isEmpty()){ //如果队列是空的,直接插入

this.push(queObj);

}else{

var bAdded = false;

for(var i = 0, len = items.length; i < len; i++){

if(priority < items[i].priority){

items.splice(i, 0, queObj); // 循环队列,如果优先级小于这个位置元素的优先级,插入

bAdded = true;

break;

}

}

if(!bAdded){

items.push(queObj); // 如果循环一圈都没有找到能插队的位置,直接插入队列尾部

}

}

};

this.dequeue = function () {

return items.shift();

};

this.front = function () {

return items[0];

};

this.isEmpty = function () {

return items.length === 0;

};

this.size = function () {

return items.length;

};

this.clear = function () {

items = [];

};

this.print = function () {

//这个地方稍微修改一下下

var temp = [];

for(var i = 0, len = items.length; i < len; i++){

temp.push(items[i].ele);

}

console.log(temp.toString());

};

}

解释我已经在代码里说的很明白

下面我们就用这个优先队列同样来模拟排队上WC

var pQueue = new PriorityQueue();

pQueue.enqueue('Mr.A', 3);

pQueue.enqueue('Mr.B', 3);

pQueue.enqueue('Mr.C', 3);

console.log("原队列:");

pQueue.print();

pQueue.enqueue('VIP', 2);

pQueue.enqueue('SVIP', 1);

console.log("新队列:");

pQueue.print();

控制台打印:

d578c7fc15cbec638bb37604133b640e.png

循环队列

循环队列典型的例子击鼓传花

还记得在我上高中的时候我们晚自习一停电就玩这个

拿一个东西当“花”,轮着传,“鼓”一停,拿到花的同学就要站起来唱歌

可以把循环队列当作是队列的应用

下面我们来模拟实现循环队列击鼓传花

function hotPotato(pepoleList, frequency){ //参数:表示人的数组,传花的频率

var queue = new Queue();

for(var i = 0, len = pepoleList.length; i < len; i++){

queue.enqueue(pepoleList[i]); //初始化,进入队列

}

var eliminated;//被淘汰的同学

while(queue.size() > 1){ //只要队列至少还有两个人,就一直循环

for(var i = 0; i < frequency; i++){//出队入队,模拟循环效果

queue.enqueue(queue.dequeue());

}

eliminated = queue.dequeue();//清算

console.log(eliminated + '被淘汰');

}

return queue.dequeue();//返回队列中的最后一人

}

var pepole = ['Mr.A','Mr.B','Mr.C','Mr.D','Mr.E','Mr.F'];

var gameWinner = hotPotato(pepole, 12);

console.log('全场最佳:' + gameWinner);

控制台输出:

b68cddd1aa207cb281b97d0314ab0298.png

以上就是JavaScript下的队列实现。

我们还简单理解了两个特殊的队列:优先队列与循环队列。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Abp小试牛刀之 图片上传

图片上传是很常见的功能&#xff0c;里面有些固定的操作也可以沉淀下来。本文记录使用Abp vNext做图片上传的姿势。目标上传图片----->预览图片----->确定保存支持集群部署实现思路&#xff1a;1. 上传图片要使用WebAPI特定媒体类型&#xff1a;multipart/form-data;2. 因…

.Net Conf 2020 之回顾

Intro上周 .NET Conf 在苏州成功举办了第二届活动&#xff0c;一年一度的 .NET 盛会又来了&#xff0c;今年大会依然有许多从外地过来参加的开发者们&#xff0c;也有很多讲师也是从外地赶过来为我们分享。虽然今年是疫情的一年&#xff0c;并没有影响 .NET Conf 参会者们的热情…

如何使用 C# 在异步代码中处理异常

异常处理是一种处理运行时错误的技术&#xff0c;而 异步编程 允许我们在处理资源密集型的业务逻辑时不需要在 Main 方法或者在 执行线程 中被阻塞&#xff0c;值得注意的是&#xff0c;异步方法和同步方法的异常处理机制是不一样的&#xff0c;本篇我们就来讨论下如何在异步方…

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型&#xff0c;曾几何时&#xff0c;我们想把所有数据存到内存中的 数据结构 中&#xff0c;但为了多机器共享内存&#xff0c;不得不将这块内存包装成wcf单独部署&#xff0c;同时还要考虑怎么序列化&#xff0c;烦心事太多太多。。。后来才知道…

代码质量在「内卷时代」的重要性

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「173」篇原创敬上大家好&#xff0c;我是Z哥。提到代码质量&#xff0c;不知道你的脑海中浮现出的第一个词是什么&#xff1f;规范&#xff1f;可读性&#xff1f;…

.NET Core AWS S3云存储

【导读】最近有需要用到AWS S3云存储上传附件&#xff0c;这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录&#xff0c;或许能对后续有用到的童鞋提供一点帮助Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务&#xff0c;提供行业领先的可…

MiniProfiler,一个.NET简单但有效的微型分析器

背景MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC的性能分析的小程序。可以对一个页面本身&#xff0c;及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容&#xff0c;并可以显示数据库访问的SQL&#xff08;支持EF、EF …

龙芯.NET正式发布 稳步推进生态建设

2020年12月19日&#xff0c;2020中国. NET开发者大会于苏州开幕。此次大会上&#xff0c;龙芯发布了龙芯.NET 3。龙芯.NET 3基于.NET Core 3.1&#xff0c;支持该版本具备的所有主要功能&#xff0c;包括GC、AOT等。CoreCLR、CoreFX、ASP.NET Core等库的测试通过情况与x64/arm6…

有温度的技术,改善上亿人的生活

06有温度的技术&#xff0c;改善上亿人的生活鱼小皮哥&#xff0c;现在的 APP 真是越来越难用了&#xff0c;功能多、操作复杂、广告更多。唉&#xff0c;可不是么&#xff0c;而且人们的生活已经离不开 APP 了&#xff01;老百鱼小皮我爷爷最近的视力下降的很快&#xff0c;用…

Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...

三、 Linux 系统目录结构/bin — 用来贮存用户命令。目录 /usr/bin 也被用来贮存用户命令。/sbin — 许多系统命令(例如 shutdown)的贮存位置。目录 /usr/sbin 中也包括了许多系统命令。/root — 根用户(超级用户)的主目录。/mnt — 该目录中通常包括系统引导后被挂载的文件系统…

刚转Java?那准备转回.NET5吧!

再过几天就2021年了&#xff0c;回首今年最大的变化就是.NET5的发布&#xff0c;终结了.NET Framework和.NET Core两个分支。虽然因为新冠疫情原因&#xff0c;原定于.NET5的部分功能被推迟到.NET6了&#xff0c;但.NET5是一个非常非常重要的版本&#xff0c;会载入史册的一个版…

在 xunit 测试项目中使用依赖注入

在 xunit 测试项目中使用依赖注入Intro之前写过几篇 xunit 依赖注入的文章&#xff0c;今天这篇文章将结合我在 .NET Conf 上的分享&#xff0c;更加系统的分享一下在测试中的应用案例。之所以想分享这个话题是因为我觉得在我们开发过程中测试是非常重要的一部分&#xff0c;高…

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具独立观察员 2020 年 12 月 26 日前一段看到微信公众号 “码农读书” 上发了一篇文章《如何使用 C# 中的 FileSystemWatcher》&#xff08;翻译自&#xff1a;https://www.infoworld.com/article/3185447/how-to-work-w…

u盘安全删除 linux,为什么要安全删除U盘

原标题&#xff1a;为什么要安全删除U盘移除闪存设备时会对电脑造成危害吗&#xff1f;我们为什么要安全的移除它们&#xff1f;历史上&#xff0c;操作系统将磁盘作为信任对象不需要突然改变状态。当读写文件时&#xff0c;操作系统不希望文件在读写的过程中突然消失。如果文件…

如何在 C# 中使用 投影(Projection)

投影(Projection) 是一种可以将查询结果进行 塑性 的一种操作&#xff0c;你可以使用 投影 将一个 object 转成仅包含你需要属性的新对象&#xff0c;这篇文章中&#xff0c;我们就一起看看如何使用 投影 功能。C# 中的投影 LINQ 集成查询中有两个支持投影的扩展方法&#xff0…

Linux语言写的高通滤波,高通滤波器c语言实现

描述高通滤波器&#xff0c;又称低截止滤波器、低阻滤波器&#xff0c;允许高于某一截频的频率通过&#xff0c;而大大衰减较低频率的一种滤波器。它去掉了信号中不必要的低频成分或者说去掉了低频干扰。高通滤波器是一种让某一频率以上的信号分量通过&#xff0c;而对该频率以…

在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 [1].NET 是一个开源软件框架&#xff0c;用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu [2]允许您同时为 Ubuntu 和 Windows 构…

明源云·天际,地产⾏业的Salesforce Lightning Platform

源宝导读&#xff1a;2020年11月6日&#xff0c;明源云在CIO峰会上正式对外发布了“天际开放平台”&#xff0c;这是明源云凝聚其20多年行业经验打造的一款企业级PaaS平台。本文将介绍我们对企业级PaaS平台的行业思考&#xff0c;以及为加速泛地产生态链数字化转型而做的技术创…

c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...

置顶欢迎大家选修C语言程序设计这门课&#xff0c;本帖解释一下一些常见的问题叶卡林娜发表于2017年01月05日首先欢迎大家选修浙大翁恺老师的C语言程序设计课程。开课2天就看到讨论区已经有这么多帖子&#xff0c;说明同学们的学习热情很高。结合前几次开课的经验以及目前在讨论…

IdentityServer4系列 | 支持数据持久化

一、前言在前面的篇章介绍中&#xff0c;一些基础配置如API资源、客户端资源等数据以及使用过程中发放的令牌等操作数据&#xff0c;我们都是通过将操作数据和配置数据存储在内存中进行实现的&#xff0c;而在实际开发生产中&#xff0c;我们需要考虑如何处理数据持久化呢&…