js实现数据结构 - 队列

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

1.构造函数构建队列函数

let  Queue = (function () { 
     const items = new WeakMap(); 
     const weak = {};
     return function(){
            items.set(weak, []); 
            this. enqueue = function() {  //向队列添加一个或多个元素
                let arr = items.get(weak);
                for(let i = 0,length = arguments.length;i<length;i++){
                	arr.push(arguments[i]);
                }
            };
            this.dequeue= function(valule) {  //从队列移除元素
                let arr = items.get(weak);
                return arr.shift(); //返回移除的元素
            }
             this.front = function(){  //查看队列头元素
                let arr = items.get(weak);
                 return arr[0]; 
            }
            this.isEmpty = function(){   //检查队列是否为空
                 let arr = items.get(weak);
                 return arr.length == 0; 
            }
            this.print = function(){ 
                 let arr = items.get(weak);
                 console.log(arr.toString()); 
            }
         }
})(); 
let queue = new Queue();
queue.enqueue(1,2,3);
console.log(queue.isEmpty());//false
queue.print();//1,2,3

2.用ES6语法实现队列函数

let  Queue = (function () { 
     const items = new WeakMap(); 
    class Queue1 {
          constructor(){
             items.set(this,[]);
          }
          enqueue () {  //向队列添加一个或多个元素
             let arr = items.get(this);
             for(let i = 0,length = arguments.length;i<length;i++){
                 arr.push(arguments[i]);
              }
          };
          dequeue(valule) {  //从队列移除元素
                let arr = items.get(this);
                return arr.shift(); //返回移除的元素
          }
          front (){  //查看队列头元素
                let arr = items.get(this);
                 return arr[0]; 
          }
          isEmpty(){   //检查队列是否为空
               let arr = items.get(this);
               return arr.length == 0; 
          }
          print (){ 
               let arr = items.get(this);
               console.log(arr.toString()); 
          }
    }
     return Queue1
})(); 
let queue = new Queue();
queue.enqueue(1,2,3);
console.log(queue.isEmpty());//false
queue.print();//1,2,3

3.优先队列

元素的添加和移除是基于优先级的。一个现实的例子就是机场登机的顺序。头等舱和商务舱乘客的优先级要高于经济舱乘客。在有些国家,老年人和孕妇(或带小孩的妇女)登机时也享有高于其他乘客的优先级。另一个现实中的例子是医院的(急诊科)候诊室。医生会优先处理病情比较严重的患者。通常,护士会鉴别分类,根据患者病情的严重程度放号。实现一个优先队列,有两种选项:设置优先级,然后在正确的位置添加元素;或者用入列操作添加元素,然后按照优先级移除它们。

let PriorityQueue = (function() { 
 	const items = new WeakMap(); 
    const weak = {};
    function QueueElement (element, priority){
 		this.element = element; 
 		this.priority = priority; 
 		} 
    return function(){
    items.set(weak, []); 
 	this.enqueue = function(element, priority){ 
 		let arr = items.get(weak);
 		let queueElement = new QueueElement(element, priority); 
 		let added = false; 
 		for (let i=0; i<arr.length; i++){ 
 			if (queueElement.priority < arr[i].priority){ 
 				arr.splice(i,0,queueElement); 
 				added = true; 
 				break; // {4} 
 			} 
 		} 
 		if (!added){ 
 			arr.push(queueElement); 
 		} 
 	}; 
 	this.dequeue= function(valule) {  //从队列移除元素
         let arr = items.get(weak);
          return arr.shift(); //返回移除的元素
     }
     this.front = function(){  //查看队列头元素
          let arr = items.get(weak);
          return arr[0]; 
            }
     this.isEmpty = function(){   //检查队列是否为空
          let arr = items.get(weak);
          return arr.length == 0; 
     }
 	 this.print = function(){ 
 	 	let arr = items.get(weak);
 		for (let i=0; i<arr.length; i++){ 
 		console.log(`${arr[i].element} - ${arr[i].priority}`); 
 		} 
 	 }; 
	 }
  })()
let queue = new PriorityQueue();
console.log(queue);
queue.enqueue('zhanhong',2);
queue.enqueue('zhan3',3);
queue.enqueue('zhan4',4);
queue.enqueue('zhang1',1);
console.log(queue.isEmpty());
console.log(queue.front());
queue.print();

4.javascript 任务队列

当我们在浏览器中打开新标签时,就会创建一个任务队列。这是因为每个标签都是单线程处理所有的任务,它被称为事件循环。浏览器要负责多个任务,如渲染HTML,执行JavaScript代码,处理用户交互(用户输入、鼠标点击等),执行和处理异步请求。

posted on 2019-03-19 13:57  长安城下翩翩少年  阅读(390)  评论(0编辑  收藏  举报