数据结构与算法–队列(Queue)–JS
队列(Queue)
是一种受限的线性表,先进先出(FIFO, First In First Out),只能在前端进行删除操作,在后端进行插入操作
队列的实现和栈一样,有两种方案:
基于数组的实现、基于链表的实现
//封装队列类
function Queue() {
//属性
this.items = [];
//方法
//1.将元素加入到队列中
Queue.prototype.enqueue = function (element) {
this.items.push(element);
}
//2.从队列中删除前端元素
Queue.prototype.dequeue = function () {
return this.items.shift();
}
//3.查看前端的元素
Queue.prototype.front = function () {
return this.items[0];
}
//查看队列是否为空
Queue.prototype.isempty = function () {
return this.items.length == 0;
}
//查看队列中的元素个数
Queue.prototype.size = function () {
return this.items.length;
}
//6.toString方法
Queue.prototype.toString = function () {
var resultStr = '';
for (var i = 0; i < this.items.length; i++) {
resultStr += this.items[i];
}
return resultStr;
}
}
var queue = new Queue();
queue.enqueue('abd');
alert(queue);
示例:击鼓传花
班级玩一个游戏,所有学生围城一个圈,从某位同学受力开始向旁边同学传花,这个时候某个人在击鼓,鼓声一停,话在谁手里,谁获胜 修改游戏规则: 几个朋友一起玩一个游戏,围成一圈,开始数一个固定的数(其实也可以每次随意一个数),数到某个数字的人自动淘汰,最后剩下的这个人获胜,请问最后剩下的人原来在哪个位置上
function passGame(nameList, num) {
var queue = new Queue();
//将所有人依次加入到队列中
for (var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
//开始数数字
while (queue.size() > 1) {
//不是num的时候,重新加入到队列的末尾
//是num的时候,将其从队列中删除
//num数字之前的人重新放入到队列末尾
for (var i = 0; i < num; i++) {
queue.enqueue(queue.dequeue());
}
//num对应的这个人,直接从队列中删除掉
queue.dequeue();
}
//获取剩下的那个人
var endName = queue.front();
return nameList.indexOf(endName);
}
var names = ['li', 'zhao', 'liu', 'ha'];
alert(passGame(names, 2));
优先级队列
在插入一个元素的时候会考虑该数据的优先级,和其他数据优先级进行比较,比较后,可以得出这个元素在队列中的正确的位置,其他处理方式和基本的队列一样 优先级队列主要考虑的问题: 1.每个元素不再只是一个数据,而且包含数据的优先级 2.在添加方式中,根据优先级放入正确的位置
//封装优先级队列
function PriorityQueue() {
//在PriorityQueue内重新创建一个类:可以理解为内部类
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
//封装属性
this.items = [];
//实现插入方法
PriorityQueue.prototype.enqueue = function (element, priority) {
//创建QueueElement对象
var queueElement = new QueueElement(element, priority);
//判断队列是否为空
if (this.items.length == 0) {
this.items.push(queueElement);
} else {
//标识符
var added = false;
for (var i = 0; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, 0, queueElement);
added = true;
break;
}
}
if (!added) {
this.items.push(queueElement);
}
}
}
//其他属性和正常队列一致
//2.从队列中删除前端元素
PriorityQueue.prototype.dequeue = function () {
return this.items.shift();
}
//3.查看前端的元素
PriorityQueue.prototype.front = function () {
return this.items[0];
}
//查看队列是否为空
PriorityQueue.prototype.isempty = function () {
return this.items.length == 0;
}
//查看队列中的元素个数
PriorityQueue.prototype.size = function () {
return this.items.length;
}
//6.toString方法
PriorityQueue.prototype.toString = function () {
var resultStr = '';
for (var i = 0; i < this.items.length; i++) {
resultStr += this.items[i].element + '-' + this.items[i].priority + ' ';
}
return resultStr;
}
}
var pq = new PriorityQueue();
pq.enqueue('abc', 111);
alert(pq);
pq.enqueue('dac', 200);
pq.enqueue('aff', 50);
alert(pq);
|