队列是遵循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){ // {1} 
        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){ // {2} 
                arr.splice(i,0,queueElement); // {3} 
                added = true; 
                break; // {4} 
            } 
        } 
        if (!added){ 
            arr.push(queueElement); //{5} 
        } 
    }; 
    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代码,处理用户交互(用户输入、鼠标点击等),执行和处理异步请求。

版权声明:本文为honkerzh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/honkerzh/p/10558214.html