zoukankan      html  css  js  c++  java
  • JavaScript 算法 1_2 先进先出队列 (链表实现)

    JavaScript 算法 1_2 先进先出队列 (链表实现)

    队列, 先进先出, 和食堂排队打饭类似


    1. 类定义

    // 类定义
    class Queue{
      constructor() {
        // 队头元素, 包括 next 和 ele
        this.first = null;
        // 队尾元素
        this.last = null;
        this.count = 0;
      }
      get nodeConstruct(){
        return {ele: null, next: null}
      }
      isEmpty(){
        return this.count === 0;
      }
      size(){
        return this.count;
      }
    
      /**
       * 队尾添加元素
       * @param item 要添加的元素
       */
      enqueue(item){
        let oldLast = this.last;
        this.last = {};
        Object.assign(this.last, this.nodeConstruct);
        this.last.ele = item;
    
        if( this.isEmpty() ) this.first = this.last;
        else oldLast.next = this.last;
        this.count++;
      }
    
      /**
       * 从队首删除元素并返回
       * @returns {*|null}
       */
      dequeue(){
        if(this.isEmpty()) {
          throw new Error('无元素可删');
        }
        let top = this.first.ele;
        this.first = this.first.next;
        this.count--;
        if(this.isEmpty()){
          this.last = null;
        }
        return top;
      }
      // 下回分解迭代器
      // [Symbol.iterator](){
      //
      // }
    }
    

    实现了队列分布先进先出的方式


    2. 构造链表

    get nodeConstruct(){
        return {ele: null, next: null}
      }
    

    使用了 nodeConstruct 变量存储链表结构


    3. 从表头插入和删除元素

    **
       * 队尾添加元素
       * @param item 要添加的元素
       */
      enqueue(item){
        let oldLast = this.last;
        this.last = {};
        Object.assign(this.last, this.nodeConstruct);
        this.last.ele = item;
    
        if( this.isEmpty() ) this.first = this.last;
        else oldLast.next = this.last;
        this.count++;
      }
    
      /**
       * 从队首删除元素并返回
       * @returns {*|null}
       */
      dequeue(){
        if(this.isEmpty()) {
          throw new Error('无元素可删');
        }
        let top = this.first.ele;
        this.first = this.first.next;
        this.count--;
        if(this.isEmpty()){
          this.last = null;
        }
        return top;
      }
    
    • 插入时先保存尾部节点, 后转换尾部节点, 判断是否是空节点
    • 删除时移除队首元素并返回
    • 注意元素数为0时

    4. 使用

    const queue = new Queue();
    queue.enqueue(12);
    queue.enqueue('apple');
    
    let dequeue = queue.dequeue();
    console.log(dequeue);
    
    queue.enqueue([11, 13]);
    queue.enqueue({age: 15});
    queue.enqueue('小歪');
    
    dequeue = queue.dequeue();
    console.log(dequeue);
    /*
    12
    Queue {
      first: { ele: 'apple', next: { ele: [Array], next: [Object] } },
      last: { ele: '小歪', next: null },
      count: 4
    }
    */
    
    
  • 相关阅读:
    MOSS产品概述[转帖]
    学习WF笔记9自定义活动示例(6)
    MOSS之五母版页 布局页 Features[转帖]
    MOSS系列之四用户组和用户[转帖]
    MOSS之六Web Part[转帖]
    MOSS系列之三列表和文档库[转帖]
    学习WF笔记9自定义活动的外观(5)
    学习WF笔记9 自定义活动中事件类型的属性(3)
    MOSS系列之二(MOSS安装)[转帖]
    学习WF笔记9自定义活动的验证方式(4)
  • 原文地址:https://www.cnblogs.com/xiaxiangx/p/14276875.html
Copyright © 2011-2022 走看看