js实现循环队列

1.基本队列的实现:
基本队列的方法有:
1)向队尾添加元素(enqueue)
2)从对头删除元素(dequeue)
3)查看队列头部元素(front)
4)查看队列是否为空(isEmpty)
5)查看队列的长度(size)
6)查看队列(print)

function Queue(){
	//使用数组初始化队列
	var items=[];
	//向队列插入元素
	this.enqueue=function(elem){
		items.push(elem);
	}
	//从队头删除元素
	this.dequeue=function(){
		return items.shift();
	}
	//查看对头元素
	this.front=function(){
		return items[0];
	}
	//判断队列是否为空
	this.isEmpty=function(){
		return items.length==0;	
	}
	//查看队列的长度
	this.size=function(){
		return items.length;	
	}
	//查看队列
	this.print=function(){
		return items.toString();	
	}
}

可以使用循环队列来模拟击鼓传花的游戏(约瑟夫环问题):一群孩子围成一圈,每次传递 n 个数,停下来时手里拿花的孩子被淘汰,直到队伍中只剩下一个孩子,即胜利者。
循环队列,每次循环的时候(从队列头部)弹出一个孩子,再把这个孩子加入到队列的尾部,循环 n 次,循环停止时弹出队列头部的孩子(被淘汰),直到队列中只剩下一个孩子。

function circularQueue(arr,n){
	//实例化一个队列
	var queue=new Queue();
	//将孩子加入到对列中
	for(var i=0;i<arr.length;i++){
		queue.enqueue(arr[i]);
	}
	当队列的长度大于1时执行循环
	while(queue.size()>1){
		//将第n个前面的数依次从对队尾插入
		for(var j=0;j<n-1;j++){
			queue.enqueue(queue.dequeue());	
		}	
		//删除n个数
		queue.dequeue();
	}
	//返回剩余的一个数
	return queue.dequeue();
}

对于上述问题不适用队列,但是原理和队列是一样的方法

function circleQueue(arr,n){
	if(arr.length>=m){
		while(arr.length>=m){
			arr=arr.slice(m).concat(arr.slice(0,m-1));
		}
	}
	while(arr.length>1){
		var i=m%arr.length;
		arr=i>1?arr.slice(i).concat(arr.slice(0,i-1)):arr.slice(i);
	}
	console.log(arr[0]);
}

或者:

function circleQueue(arr,n){
	while(arr.length>1){
		for(var i=0;i<n-1;i++){
			arr.push(arr.shift());	
		}
		arr.shift();
	}
	console.log(arr[0]);
}

循环队列参考链接:https://www.cnblogs.com/dee0912/p/4960025.html

你可能感兴趣的:(算法)