js実装サイクルキュー

14073 ワード

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個の数を伝えるたびに、止まったときに手に花を持っていた子供が淘汰され、チームに子供が1人しか残っていないまで、勝者になります.キューをループし、ループするたびに(キューヘッダから)1人の子供をポップアップし、この子をキューの末尾に追加し、n回ループし、ループが停止するとキューヘッダをポップアップ(淘汰)し、キューに1人の子供しか残っていないまで.
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