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. 因…

php 发邮件 500错误,使用PHP发送邮件出现这个错误:The following From address failed:xxxx@163.com...

使用了TP框架!以下是源码:namespace ApiController;use ThinkController;class EmailController extends Controller{public function test(){$msg pmail(493107977qq.com,午夜DJ,封装测试,hello world);echo $msg;}?php>return array(//配置项>配置值TMPL_PARSE_STRIN…

.Net Conf 2020 之回顾

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

php里面电话验证码,PHP的中问验证码

Class code{var $width 160; //图片的宽var $hight 40; //图片的高var $image;var $red 223; //图片的RGB颜色var $green 225; //红var $blue 227 ;//绿var $pix 227 ;//蓝var $pixcolor; //杂色颜色;var $pixred 242; //红var $pixgreen 168;//绿var $pixblue 162; //蓝var…

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

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

在oracle中游标的操作,Oracle中的游标和函数详解

Oracle中的游标和函数详解1.游标游标是一种 PL/SQL 控制结构&#xff1b;可以对 SQL 语句的处理进行显示控制&#xff0c;便于对表的行数据逐条进行处理。 游标并不是一个数据库对象&#xff0c;只是存留在内存中。操作步骤&#xff1a;声明游标打开游标取出结果&#xff0c;此…

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

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

php查询类似abab,ABAB中的正则表达式匹配编号(必须相同) - php

我已经搜索了许多答案来匹配ABAB pattern&#xff0c;这些答案与1212或2323的任意字符匹配&#xff0c;已阅读this too但我发现匹配ABAB模式的模式不起作用&#xff0c;它也匹配4444我试图找出模式来匹配以下主题&#xff1a;232345459898但可能不匹配4444或5555&#xff0c;因…

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

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

oracle asm 配置失败,Oracle ASMLib安装与配置

什么是ORACLE ASMLib&#xff1f;ASMLib 是一个适用于 Oracle 数据库 的自动存储管理(ASM)功能的支持库。ASM简化了数据库和管理&#xff0c;它不再需要 DBA 直接管理可能数千个的 Oracle 数据库文件&#xff0c;而只需管理分配给 Oracle 数据库的磁盘组。ASMLib 令使用 ASM 的…

.NET Core AWS S3云存储

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

oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...

1.查看表空间使用情况with ts as (SELECT d.tablespace_name "Name", d.status "Status",TO_CHAR (NVL (a.MAXBYTES / 1024 / 1024 /1024, 0), 99,999,990.90) "Maxsize (G)",TO_CHAR (NVL (a.BYTES / 1024 / 1024 /1024, 0), 99,999,990.90) &q…

如何解决在ASP.NET Core中找不到图像时设置默认图像

背景web上如果图片不存在一般是打xx&#xff0c;这时候一般都是会设置默认的图片代替。现在用中间件的方式实现统一设置&#xff0c; 一次设置&#xff0c;全部作用 。此示例演示如何解决在ASP.NET Core中找不到图像时设置默认图像先决条件Visual Studio 2017或更高版本。启用V…

缩减oracle日志,[20180829]减少日志生成量.txt

[20180829]减少日志生成量.txt--//最近一段时间优化一下生产数据库,主要是问题比我预计要严重,实际上exadata实在太快了,把许多问题都给掩盖了.--//实际上这个问题很早就存在,我实在不想提,基于国内许多应用都可能存在类似问题,还是写一下.SQL ordered by Executions%CPU - CPU…

ACM中算法时间约束

ACM中算法时间约束 一般ACM竞赛C/C的时间限制是一秒&#xff0c;因此可以根据题目数据来推断该题所使用的算法。 算法的时间复杂度在 1 0 7 10^7 107左右合适&#xff0c;最多不能超过 1 0 8 10^8 108&#xff0c; O ( n ) O(n) O(n)的极限就在 1 0 8 10^8 108左右。 问题规…

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

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

oracle类似isempty,NULLs和empty strings在不同数据库的中特点

1.以oracle为例SQL> create table test(id int primary key,content varchar(20));SQL> INSERT INTO test (id, content) VALUES (1, NULL);SQL> INSERT INTO test (id, content) VALUES (2, );SQL> INSERT INTO test (id, content) VALUES (3, );SQL> INSERT …

龙芯.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 — 该目录中通常包括系统引导后被挂载的文件系统…