隊列
- 普通隊列 先進先出FIFO
- 循環(huán)隊列 隊首出隊后诅妹,又從隊尾入隊
- 優(yōu)先隊列
如果優(yōu)先值小的元素放到隊列的前面,這叫做最小優(yōu)先隊列
反之優(yōu)先值大的元素放到隊列的前面,這叫做最大優(yōu)先隊列
隊列的操作(就是醫(yī)院看病排隊)
- 向隊列中添加元素(進入排隊的隊伍中)--push
- 移除隊頭元素(隊伍最前面的人出隊,進診室)--shift
- 查看隊頭元素(查看隊伍最前面的人)--front
- 判斷隊列是否為空(看看隊伍中有沒有人)--isEmpty
- 移除隊伍全部元素(下班了笼吟,都走了吧)--clear
- 查看棧里元素個數(shù)(查看排隊的有多少人)--size
實現(xiàn)一個隊列類
function Queue(){
var queueData = [];
// FIFO=Fisrt In First Out
this.push = function(element){//入隊操作---在數(shù)組尾插入新元素
queueData.push(element);
return queueData;
};
this.shift = function(element){//出隊操作---在數(shù)組頭刪除元素
return shiftElement = queueData.shift(element);
};
this.front = function(){
return queueData[0];
};
this.size = function(){
return queueData.length;
};
this.isEmpty = function(){
return queueData.length == 0;
}
this.clear = function(){
queueData = [];
}
this.print = function(){
console.log(queueData.toString())
}
}
最小優(yōu)先隊列
function PriorityQueue(){
var queueData = [];
function QueEle(element,priority){
this.element = element;
this.priority = priority;
}
//-----------與普通隊列的不同是在入隊過程中判斷優(yōu)先級,來確定元素在隊列該插入的位置霸旗。
this.push = function(element,priority){
var queObj = new QueEle(element,priority);
if(this.isEmpty()){
this.push(queObj);
}else{
var flag = false;
for(var i=0;i<queueData.length;i++){
if(queObj.priority<queueData[i].priority){
//判斷優(yōu)先級赞厕,優(yōu)先級小的放在優(yōu)先級大的前面,
queueData.splice(i, 0, queObj);//插入元素
flag = true;
break;
}
}
if(!flag){
queueData.push(queObj);
}
}
}
this.shift = function(element){//出隊操作---在數(shù)組頭刪除元素
return shiftElement = queueData.shift(element);
};
this.front = function(){
return queueData[0];
};
this.size = function(){
return queueData.length;
};
this.isEmpty = function(){
return queueData.length == 0;
}
this.clear = function(){
queueData = [];
}
this.print = function(){
var temp = [];
for(var j=0;j<queueData.len;j++){
temp.push(queueData[i].ele);//只輸出元素的名字
}
console.log(temp.toString());
}
}
循環(huán)隊列--擊鼓傳花問題
核心代碼就是將隊列變成循環(huán)隊列定硝,按照給定的次數(shù)循環(huán)隊列后皿桑,將隊首的元素出隊,直到隊列的長度為1蔬啡。結(jié)束隊列诲侮,返回隊列中存在的最后一個值。
function JGCH(namelists,num){//nameList為姓名數(shù)組箱蟆,num為一個數(shù)字用來迭代隊列
var hua = new Queue();
for(var m=0;m<namelists.length;m++){
hua.push(namelists[m]);//將傳入的數(shù)組存入隊列中
};
var loser;
while(hua.size()>1){
for(var n=0;n<num;n++){
hua.push(hua.shift());//出隊后入隊沟绪,形成循環(huán)隊列
}
loser = hua.shift();
console.log(loser+"淘汰");//每一次迭代完成后,將隊首的出隊
}
return hua.shift();
}//詳細代碼及測試用例如下