js高级进阶之数据结构“队列”的实现

像栈一样,队列也是一种线性表。它允许在表的一端插入数据,在另一端删除元素。插入元素的这一端称之为队尾。删除元素的这一端我们称之为队首。队列的结构如下图所示。

队列的特性:

  • 在队尾插入元素,在队首删除元素。
  • FIFO(先进先出),和食堂排队打饭一样。

在这里插入图片描述
es5 实现

function Queue(){
        var temps = [];
        //队列的插入
        this.insert = function(e){
            if(e){
                temps.push(e);
            }
        }
        //队列的删除
        this.remove = function(){
           return temps.shift();
        }
        //获取队列的长度
        this.getSize = function(){
            return temps.length;
        }
        //清除队列
        this.clear = function(){
            temps = [];
        }
        //获取队列的第一个元素
        this.getFront  = function(){
            if(temps.length>0){
                return temps[0]
            }else{
                return null;
            }
        }
        //判断队列是否为空
        this.isEmpty = function(){
            return temps.length == 0;
        }

        // 打印队列内的所有元素
        this.print = function () {
            console.log(temps.toString());
        };
    }

测试:

 //====================================测试=============================

    let queue = new Queue();
    console.log(queue.isEmpty()); // true

    console.log("向队列插入数据:郭,张,刘"); 
    //向队列插入数据
    queue.insert('郭');
    queue.insert('张');
    queue.insert('刘');
    console.log("当前队列元素:"); 
    queue.print(); 
    console.log("当前队列长度:"); 
    console.log(queue.getSize()); // 3
    console.log("当前队首元素:"); 
    console.log(queue.getFront()); 
    console.log("执行队列出队操作"); 
    console.log(queue.remove()); 

    console.log("当前队列元素:"); 
    queue.print(); 
    console.log("清空队列"); 
    queue.clear();
    console.log(queue.getSize());
    

结果:
在这里插入图片描述

es6实现

let Queue = (function () {
    const items = new WeakMap();

    class Queue {
        constructor() {
            items.set(this, []);
        }

        enqueue (element) {
            let q = items.get(this);
            if (element instanceof Array) items.set(this, q.concat(element));
            else q.push(element);
        };

        dequeue () {
            let q = items.get(this);
            return q.shift();
        };

        front () {
            return items.get(this)[0];
        };

        isEmpty () {
            return items.get(this).length === 0;
        };

        size () {
            return items.get(this).length;
        };

        clear () {
            items.set(this, []);
        };

        print () {
            console.log(items.get(this).toString());
        };
    }

    return Queue;
})();
发布了69 篇原创文章 · 获赞 6 · 访问量 1865

猜你喜欢

转载自blog.csdn.net/weixin_40073115/article/details/103927073
今日推荐