1.基本队列的实现

基本队列的方法中,包含了 ①向队列(尾部)中添加元素(enqueue)、②(从队列头部)删除元素(dequeue)、③查看队列头部的元素(front)、④查看队列是否为空(isEmpty)、⑤查看队列的长度(size)、⑥查看队列(print) 等 6 个方法

代码如下:

    function Queue() {

        //初始化队列(使用数组实现)
var items = []; //向队列(尾部)中插入元素
this.enqueue = function(element) {
items.push(element);
} //从队列(头部)中弹出一个元素,并返回该元素
this.dequeue = function() {
return items.shift();
} //查看队列最前面的元素(数组中索引为0的元素)
this.front = function() {
return items[0];
} //查看队列是否为空,如果为空,返回true;否则返回false
this.isEmpty = function() {
return items.length == 0;
} //查看队列的长度
this.size = function() {
return items.length;
} //查看队列
this.print = function() {
//以字符串形势返回
return items.toString();
}
} var queue = new Queue();
queue.enqueue('hello');
queue.enqueue('world');
queue.enqueue('php');
queue.enqueue('javascript');
queue.enqueue('node.js');
console.log(queue.isEmpty()); // false
console.log(queue.print()); //hello,world,php,javascript,node.js
console.log(queue.size()); //
console.log(queue.front()); //hello console.log(queue.dequeue()); //hello
console.log(queue.isEmpty()); //false
console.log(queue.print()); //world,php,javascript,node.js
console.log(queue.size()); //
console.log(queue.front()); //world console.log(queue.dequeue()); //world
console.log(queue.dequeue()); //php
console.log(queue.dequeue()); //javascript
console.log(queue.dequeue()); //node.js
console.log(queue.isEmpty()); //true
console.log(queue.print()); //(空字符串)
console.log(queue.size()); //
console.log(queue.front()); // undefined

2.优先队列的实现

在优先队列中,元素的添加或者删除是基于优先级的。实现优先队列有两种方式:①优先添加,正常出列;②正常添加,优先出列

优先添加,正常出列的(最小优先队列)例子(这个例子在实现队列的基础上,把添加进队列的元素从普通数据改为对象(数组)类型该对象包含需要添加进队列的元素的值和优先级):

    function PriorityQueue() {

        var items = [];

        //需要插入队列的元素(该元素为对象,包括值和优先级)
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;
for(var i = 0; i < items.length; i++){
if(queueElement.priority < items[i].priority) {
items.splice(i, 0, queueElement);
added = true;
break;//终止队列循环
}
}
//当需要添加的元素的优先级比队列中任何一个元素的优先级都要高时,把该元素插入到队列的末尾
if(!added){
items.push(queueElement);
}
}
} //查看队列是否为空,如果为空,返回true;否则返回false
this.isEmpty = function() {
return items.length == 0;
} //查看队列
this.print = function() {
return items;
}
} var priorityQueue = new PriorityQueue(); priorityQueue.enqueue('dee', 10);
priorityQueue.enqueue('Learning', 2);
priorityQueue.enqueue('JavaScript', 8);
priorityQueue.enqueue('Algorithms', 20);
priorityQueue.enqueue('Data Structures', 20); console.log(priorityQueue.print());

输出(FireFox下):

 [QueueElement { element="Learning",  priority=2}, QueueElement { element="JavaScript",  priority=8}, QueueElement { element="dee",  priority=10}, QueueElement { element="Algorithms",  priority=20}, QueueElement { element="Data Structures",  priority=20}]

3.循环队列

可以使用循环队列来模拟击鼓传花的游戏(约瑟夫环问题):一群孩子围成一圈,每次传递 n 个数,停下来时手里拿花的孩子被淘汰,直到队伍中只剩下一个孩子,即胜利者。

循环队列,每次循环的时候(从队列头部)弹出一个孩子,再把这个孩子加入到队列的尾部,循环 n 次,循环停止时弹出队列头部的孩子(被淘汰),直到队列中只剩下一个孩子。

该例需要依据 "1.基本队列" 的 Queue 类来实现。

代码:

    //基本队列
function Queue() { //初始化队列(使用数组实现)
var items = []; //向队列(尾部)中插入元素
this.enqueue = function(element) {
items.push(element);
} //从队列(头部)中弹出一个元素,并返回该元素
this.dequeue = function() {
return items.shift();
} //查看队列最前面的元素(数组中索引为0的元素)
this.front = function() {
return items[0];
} //查看队列是否为空,如果为空,返回true;否则返回false
this.isEmpty = function() {
return items.length == 0;
} //查看队列的长度
this.size = function() {
return items.length;
} //查看队列
this.print = function() {
//以字符串形势返回
return items.toString();
}
} //循环队列
//@param Obj nameList 名单
//@param Int num 指定的传递次数
function hotPotato(nameList, num) { var queue = new Queue(); //把名单插入队列
for(var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
} //淘汰者的名字初始值
var eliminated = ''; //当队列里的人数大于1人时,继续传递
while(queue.size() > 1) {
for(var i = 0; i < num; i++) {
//每次把队列头部弹出的队员再次插入队列的尾部,行程一个循环队列
queue.enqueue(queue.dequeue());
}
//当循环停止时,即到了指定的传递次数时,弹出队列头部的队员
eliminated = queue.dequeue();
console.log(eliminated + '被淘汰');
} //当队列中只剩下一个队员时,即是胜利者
return queue.dequeue();
} var names = ['dee', 'death mask', 'saga', 'mu', 'alexis'];
var winner = hotPotato(names, 7);
console.log('胜利者是' + winner);

输出:

我们单位的面试题中有一道题也是一样的道理:

一群猴子排成一圈,按 1,2,...,n 依次编号。然后从第 1 只开始数,数到第 m 只,把它踢出圈,从它后面再开始数,再数到第 m 只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入 m、n,输出最后那个大王的编号。

使用 JavaScript 实现基本队列、优先队列和循环队列的更多相关文章

  1. Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法

    前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...

  2. 39 _ 队列5 _ 循环队列需要几个参数来确定 及其含义的讲解.swf

    上面讲解都是循环队列,如果是链表实现的话就很简单,队列只有循环队列才比较复杂 此时队列中只存储一个有效元素3,当在删除一个元素的时候,队列为空,pFont向上移动,pFont等于pRear,但是此时p ...

  3. javascript的队列,优先队列,循环队列

    按书上的来弄的.慢慢理解了. function Queue() { var items = []; this.enqueue = function(element){ items.push(eleme ...

  4. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  5. 数据结构----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  6. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  7. 622.设计循环队列 javascript实现

    设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列 ...

  8. 《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列

    第四章涉及三种数据存储类型:栈,队列,优先级队列 1.概括:他们比数组和其他数据存储结构更为抽象,主要通过接口对栈,队列和优先级队列进行定义.这些 接口表明通过他们可以完成的操作,而他们的主要实现机制 ...

  9. 数据结构:循环队列(C语言实现)

    生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结 ...

随机推荐

  1. MapReduce应用案例--简单的数据去重

    1. 设计思路 去重,重点就是无论某个数据在文件中出现多少次,最后只是输出一次就可以. 根据这一点,我们联想到在reduce阶段数据输入形式是 <key, value list>,只要是k ...

  2. Codeforces 696D Legen...(AC自动机 + 矩阵快速幂)

    题目大概说给几个字符串,每个字符串都有一个开心值,一个串如果包含一次这些字符串就加上对应的开心值,问长度n的串开心值最多可以是多少. POJ2778..复习下..太弱了都快不会做了.. 这个矩阵的乘法 ...

  3. mac 快捷键大全

    1.control+space 可以使用 spotlight搜索,用于快速找到所需要的文件 2.我尝试使用android studio 提示的快捷键来进行写代码,发现自己按照它的提示操作没有成功,原因 ...

  4. Shell 编程基础之 For 练习

    一.语法 for var in con1 con2 con3 ... do # 执行内容 done for var in {min..max} do # 执行内容 done for (( 初始值; 限 ...

  5. 【原】iOS学习42即时通信之XMPP(1)

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  6. 如何真正提高ASP.NET网站的性能

    摘要:前言 怎么才能让asp.net网站飞得更快,有更好的性能?这是很多开发者常常思考的一个问题.我有时候会做大量的测试,或请求别人帮忙采集一些数据,希望能够验证网上一些专家的建议或证明 前言 怎么才 ...

  7. Javascript 多浏览器兼容性问题及解决方案

    一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...

  8. POJ 1244 Slots of Fun(计算几何)

    题目链接 很简单的一题,数据 很小,直接暴力的.但是也是写也好久,有几个数,没算好...一次CE,一次PE,3Y. #include <iostream> #include <cst ...

  9. 查看那个进程占用了端口号(LINUX与AIX)

    在LINUX中: netstat命令 [root@limt ~]# netstat -tulp Active Internet connections (only servers) Proto Rec ...

  10. Windows Maven package时报错问题的解决

    google了一把,看到别人的说法是Stack size 不够大. Stack Space用来做方法的递归调用时压入Stack Frame.所以当递归调用太深的时候,就有可能耗尽Stack Space ...