• js实现队列结构


    创建队列

    let items
    function Queue {
        this.enqueue = function(element){
            items.push(element)
        }
        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(){
            console.log(items.toString())
        }
    }
    
    
    
    

    使用ES6改造

    
    let Queue = (function(){
        const items = new WeakMap()
        
        class Queue {
            constructor(){
                items.set(this,[])
            }
            enqueue(element){
                let q = items.get(this)
                q.push(element)
            }
            dequeue(){
                let q = items.get(this)
                let r = q.shift()
                return r
            }
        }
        
        return Queue
    })()
    
    

    最小优先队列

    function PriorityQueue(){
      let items = []
      
      function QueueElement(element,priority){
        this.element = element
        this.priority = priority
      }
      
      let added = false;
      this.enqueue = function(element,priority){
        let queueElement = new QueueElement(element,priority)
         
         for(let i = 0; i < items.length; i++){
           if(queueElement.priority < items[i].priority){
             items.splice(i,0,queueElement)
             added =true
             break
           }
         }
        
        if(!added){
          items.push(queueElement)
        }
      }
      
      this.print = function(){
        console.log(items)
      }
    }
    
    

    双端队列

    class Deque {
        constructor(){
            this.count = 0;
            this.lowestCount = 0;
            this.items = {}
        }
        addFront(element){
            if(this.isEmpty()){
                this.addBack(element)
            } else if(this.lowestCount > 0){
                this.lowestCount --
                this.items[this.lowestCount] = element
            } else {
                for(let i = this.count; i > 0; i--){
                    this.items[i] = this.items[i -1]
                }
                this.count ++
                this.items[0] = element
            }
        }
        addBack(element){
            this.items[this.count] = element
            this.count ++
        }
        removeFront(){
            if (this.isEmpty()) {
              return undefined;
            }
            const result = this.items[this.lowestCount];
            delete this.items[this.lowestCount];
            this.lowestCount++;
            return result;
        }
        
        removeBack() {
            if (this.isEmpty()) {
              return undefined;
            }
            this.count--;
            const result = this.items[this.count];
            delete this.items[this.count];
            return result;
         }
        
        peekFront() {
            if (this.isEmpty()) {
              return undefined;
            }
            return this.items[this.lowestCount];
        }
        
        peekBack() {
            if (this.isEmpty()) {
              return undefined;
            }
            return this.items[this.count - 1];
        }
        
        isEmpty() {
            return this.size() === 0;
        }
        
        clear() {
            this.items = {};
            this.count = 0;
            this.lowestCount = 0;
        }
        
        size() {
            return this.count - this.lowestCount;
        }
    
        toString() {
            if (this.isEmpty()) {
              return '';
            }
            let objString = `${this.items[this.lowestCount]}`;
            for (let i = this.lowestCount + 1; i < this.count; i++) {
              objString = `${objString},${this.items[i]}`;
            }
            return objString;
        }
    }
    

    循环队列

    function hotPotato(nameList,num){
        let queue = new Queue()
        
        for(let i = 0; i < nameList; i++){
            queue.enqueue(nameList[i])
        }
        
        let eliminated = '';
        
        while(queue.size() > 1){
            for(let i = 0; i < num; i++){
                queue.enqueue(queue.dequeue)
            }
            eliminated = queue.dequeue()
            console.log(eliminated + '在击鼓传花游戏中被淘汰')
        }
        
        return queue.dequeue()  
    }
    

    回文检查

    function palindromeChecker(aString){
        if(
            aString === undefined ||
            aString === null ||
            (aString !== null && aString.length === 0)
        ){
            return false
        }
        
        const deque = new Deque()
        const lowerString = aString.toLocaleLowerCase().split(' ').join('')
        let firstChar;
        let lastChar;
        
        for(let i = 0; i < lowerString.length; i++){
            deque.addBack(lowerString.charAt(i))
        }
        
        while(deque.size() > 1){
            firstChar = deque.removeFront()
            lastChar = deque.removeBack();
            if(firstChar !== lastChar){
                return false
            }
        }
        
        return true
    }
    
  • 相关阅读:
    CSS定位属性position相关介绍
    JavaScript 预解析机制
    使用 python 实现π的计算
    turtle库的学习
    关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
    关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
    关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
    Python简史
    敏捷开发原则
    线程池
  • 原文地址:https://www.cnblogs.com/pluslius/p/10331661.html
Copyright © 2020-2023  润新知