• 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代码,处理用户交互(用户输入、鼠标点击等),执行和处理异步请求。

  • 相关阅读:
    Leetcode-Partition List
    Leetcode-Gray Code
    Leetcode-Subsets II
    Leetcode-Reverse Linked List II
    Leetcode-Resotre IP Addresses
    Leetcode-Decode Ways
    Leetcode-Trapping Rain Water
    EVA 4400存储硬盘故障数据恢复方案和数据恢复过程
    HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
    ESXi5.0误删除虚拟机还有办法恢复吗?答案是可以!
  • 原文地址:https://www.cnblogs.com/honkerzh/p/10558214.html
Copyright © 2020-2023  润新知