最近一直在学习图数据结构,但是他用js实现需要用到字典,遍历的时候又需要用到栈,所以接下来我先把原来学习数据结构所记的笔记整理出来
队列基本知识
队列:和我们日常生活中的排队一样,遵循的是FIFO原则,及first in first out的原则
操作队列的方法有:
向尾部插入元素 enqueue()方法完成进队
删除头部的元素 dequeue()方法完成出队
返回队列中的第一个元素 front()方法 及最先进入队列和最先出队列的元素
还有一些用于查询的方法:
判断一个队列是否为空 isEmpty()方法 如果为空就返回true 如果不为空就返回false
返回数组的容量 size()方法
将一个数组打印出来 print()方法
接下来,我们将实现队列这个类,首先,定义一个队列的类,类中有一个私有数组,存放着我们需要的元素:
let Queue = function(){
let items = [];
}
接下来,我们来定义队列类的公共方法
//首先创建一个队列的类
let Queue = function(){
let items = [];
//在数组末尾添加元素
this.enqueue = function(e){
items.push(e);
}
//删除最开头,也是最先添加的元素
this.dequeue = function(e){
return items.shift();
}
//读取队列中的最先被添加 最先被删除的元素
this.front = function(){
return items[0];
}
//判断数组是否为空,如果为空就返回true 反之 就返回false
this.isEmpty = function(){
return items.length == 0;
}
//返回数组的容量
this.size = function(){
return items.length;
}
//打印数组
this.print = function(){
console.log(items.toString());
}
}
优先队列
就像现实生活中的订购特等舱的顾客先上机,订购经济舱的顾客后上机一样,优先队列就是对权重较大的元素(用1表示权重最大)优先进行操作,我们有两种实现方法:
将不同的元素设置优先级,根据优先及将元素添加到数组的正确位置,修改的是enqueue方法
用入列操作添加元素以后,按照元素的优先级执行出列,修改的是dequeue方法
我们将用第一种方法进行实现(如果用第二种的话用字典会更加合适一些),其他方法都不变,我们只对enqueue方法进行修改
//首先创建一个队列的类
var Queue = function(){
var items = [];
function QueueElements(element,priority){
this.element = element;
this.priority = priority;
return this;
}
//在数组末尾添加元素
this.equeue = function(element,priority){
var item = new QueueElements(element,priority);
if(this.isEmpty()){
items.push(item);
}else{
var added = false;
for(let i=0;i<items.length;i++){
//遍历数组中的元素,只要发现一个比他大的元素,就把item插到他前面
if(item.priority < items[i].priority){
items.splice(i,0,item);
//一旦插入就将added值设为true
added = true;
}
}
if(!added){
items.push(item);
}
}
};
}
//删除最开头,也是最先添加的元素
//读取队列中的最先被添加 最先被删除的元素
//判断数组是否为空,如果为空就返回true 反之 就返回false
//返回数组的容量
//打印数组
}
函数解释:这里的equeue方法 和 以往的 equeue方法区别就是,添加的元素是一个带有优先级属性的元素(QueueElements类new出来的一个对象),在添加之前先判断数组的是否为空,如果为空就直接插入,如果不为空就对优先级进行比较,只要找到比他大的就将该元素插入,将added设置为true,如果没有找到比他还大的,那么added依然是false,这时就将元素push到数组的最后
击鼓传花模拟
基本思想就是:如果没有轮到这个元素,就把该元素从头部删除添加到队列的末尾,如果传到了,就将该元素删除,继续循环剩下的元素
function hotPotato(namelist,num){
//创建一个新的队列
let queue = new Queue();
//将所有元素加入姓名的列表
for(let i=0;i<namelist.length;i++){
queue.enqueue(namelist[i]);
}
//循环指定一定的数组,如果到了就将循环到的那个数字从队列中删除
while(queue.size() > 1){
let nameitem = "";
for(let i=0;i<num;i++){
queue.enqueue(queue.dequeue());
}
nameitem = queue.dequeue();
console.log(nameitem+"将被淘汰!");
}
return queue.dequeue();
}
//验证
let names = ["John","Jack","Camila","Ingrid","Carl"];
let result = new hotPotato(names,7);
console.log("胜利者是:"+result);
函数解释:游戏不停止的条件是队列中元素的长度大于1,等于1时则择出胜利者,循环,当num不等于7时,就把末尾的移到队列前面,循环完毕,num=7,删除这个时候处在尾部的元素,继续执行上述操作,直至队列中只剩一个元素
以上是队列的全部内容,还望各位同仁大神指点一二,我虚心接受
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。