javascript数据结构与算法----队列相关(普通队列,循环队列,优先级队列)

队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。
队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。只允许顶部删除,尾部添加,是一种受限的数据结构。

function Queue() {
     var items = [];
     this.enqueue = function(element){  //进入队列
    	 items.push(element);
     };
     this.dequeue = function(){
    	 return items.shift(); //顶部出去
     };
     this.front = function(){
    	 return items[0]; //输出第一个元素
     };
     this.isEmpty = function(){
     	return items.length == 0; 
     };
     this.clear = function(){
    	 items = [];
     };
     this.size = function(){
     	return items.length;
     }; 
      this.print = function(){
     	console.log(items.toString());
     };
}

使用示例:击鼓传花
修改游戏规则:几个人站在一圈数数,疏导某个数的人就淘汰,请问最后获胜的人原来的位置?淘汰后的重新开始数数是从淘汰位置的接下来的那个人开始数数。
实现的原理:通过队列,如果数到5的人淘汰的haul,那么将所有的人排成一个队列,进行图示的操作
在这里插入图片描述
第一个人输完1,然后就从当前队列移除,添加都=到当前队列的末尾,依次操作
函数封装

function passGame(namelist,baseNum){
    var que = new Queue();
    var len = namelist.length;
    for(let i=0;i<len;i++){
        que.enqueue(namelist[i])
    }
	
	// 最后只剩一个人
    while(que.size()>1){
        for(var j=0;j<baseNum-1;j++){
            que.enqueue(que.dequeue())
        }
        que.dequeue()
    }
    let data = que.front()
    console.log(data)
    console.log(namelist.indexOf(data))
}

优先级队列
优先级队列的时候主要考虑的问题是:(1)此时的元素不再只是元素,而且包含数据的优先级(2)在添加的时候应该根据优先级添加适合的位置
优先级应用场景
在这里插入图片描述
封装优先级队列,此时假定数字越小优先级越高

function PriorityQueue() {
 	var items = [];
	 function QueueElement (element, priority){ // {1}
		 this.element = element;
		 this.priority = priority;
	 }
	 this.enqueue = function(element, priority){
	 	var queueElement = new QueueElement(element, priority);
	 	if (this.isEmpty()){
	 		items.push(queueElement); // {2}
	 	} else {
	 		// 声明一个插入队列的表示
			 var added = false;
			 for (var i=0; i<items.length; i++){
	 			if (queueElement.priority <items[i].priority){
					 items.splice(i,0,queueElement); // {3}
	 				added = true;
	 				break; // {4}
	 			}
	 		}
	 		// added为false,表示当前数组中的元素的priority都小于queueElement.priority
			 if (!added){ //{5}
	 			items.push(queueElement);
			 }
		 }
	 };
//其他方法和默认的Queue实现相同
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值