队列:队列是一种先进先出(first in first out缩写为FIFO)的线性表,只允许在一端进行插入(入队)操作,在另一端进行删除(出队)操作。在队列中允许入队操作的一段成为队尾,出队那一段称为对头,如图所示,其中1被称为对头元素,3称为队尾元素。可以简单理解为排队只有前面的有买完走了你才能买完离开
除了上面定义的队列外还有一种限定性数据结构双端队列,双端队列是插入和删除限定在线性表两端进行的线性表,分为三种情况(由于时间开发应用不多而我也不会就不讨论了)
用数组对队列进行结构封装以及栈的基本操作
enqueue(element):向队列尾部添加一个(或多个)新的项。
dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
size():返回队列包含的元素个数,与数组的length属性类似。
toString():将队列中的内容,转成字符串形式
function Queue(){
//用来接受队列的元素
this.arr=[];
Queue.prototype.enqueue=function(element){
this.arr.push(element)
},
Queue.prototype.dequeue=function(){
return this.arr.shift()
},
Queue.prototype.front=function(){
return this.arr[0]
},
Queue.prototype.isEmpty=function(){
return this.arr.length==0
},
Queue.prototype.size=function(){
return this.arr.length
},
Queue.prototype.toString=function(){
var result=''
for(var i=0;i<this.arr.length;i++){
result+=this.arr[i]+','
}
return result;
}
}
这里值得注意的是如果使用了dequeue会改变原来的队列这可能是浏览器共用一块内存的原因
二、循环队列(击鼓传花问题)
输入的num为每次要淘汰的人的位置,每次将已经安全的重新插入队列后面(注意这里面不能用front())
function chuanhua(names, num) {
var queue = new Queue();
for(var i=0;i<names.length;i++){
queue.enqueue(names[i])
}
var taotai;
while (queue.size() > 1) {
for (var i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
taotai=queue.dequeue()
console.log("被淘汰的是" + taotai);
}
return queue.dequeue()
}
var arr = ['a', 'b', 'c', 'd', 'e', 'f']
chuanhua(arr, 3);
三、优先队列
function PriorityQueue(){
//辅助类
var item=[]
var QueueItem=function(element,priority){
this.element=element;
this.priority=priority
}
this.enqueue=function(element,priority){
var queueItem=new QueueItem(element,priority)
var added=false;//用来做最后判断的
for(var i=0;i<item.length;i++){
//如果原来的优先级小于后插入的用splice替换掉原来的
if(queueItem.priority>item[i].priority){
item.splice(i,0,queueItem)
added=true
//如果不break就会和所有数据比较
break
}
}
if(!added)
//判断是否比数组中其他数大
item.push(queueItem)
}
//获取item所有里面的值
this.getItem=function(){
return item
}
}
var pq=new PriorityQueue()
pq.enqueue('小黑',10);
pq.enqueue('小红',12)