js数组实现队列数据结构与练习使用

队列定义
队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。
队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
在现实中,最常见的队列的例子就是排队:
在这里插入图片描述
但是不能插队

下面我们来实现一个队列

//定义一个队列
    function Queue(){
        var items = [];   // 存储数据

        // 向队列尾部添加一个元素
        this.enqueue = function(item){
            items.push(item);
        };

        // 移除队列头部的元素
        this.dequeue = function(){
            return items.shift();
        };

        // 返回队列头部的元素
        this.head = function(){
            return items[0];
        };

        // 返回队列尾部的元素
        this.tail = function(){
            return items[items.length-1];
        };

        // 返回队列大小
        this.size = function(){
            return items.length;
        };

        // clear
        this.clear = function(){
            items = [];
        };

        // isEmpty 判断是否为空队列
        this.isEmpty = function(){
            return items.length == 0;
        };
    };

我们可以用队列来实现 约瑟夫环

//约瑟夫环
    function del_ring(arr_list){
        var queue=new Queue();
        //将数组插入队列之中
        for(var i=0;i<arr_list.length;i++){
            queue.enqueue(arr_list[i]);
        };
        //定义一个参数 用来判断是否需要从队列顶部弹出
        var index = 0;
        //队列长度不为1一直循环
        while(queue.size() != 1){
            //弹出一个元素判断是否需要删除
            var item=queue.dequeue();
            //并且参数++
            index++;
            //判断与3取余不等于0,塞入队列尾部
            if(index%3 != 0){
                queue.enqueue(item);
            }
        }
        //返回队列剩余元素
        return queue.tail();
    }

    //造数据
    var arr_list=[];
    for(var i=0;i<100;i++){
        arr_list.push(i);
    }

    console.log(del_ring(arr_list)); //90

用队列实现 斐波那契数列

//斐波那契数列
    function feibonaqie(n){
        if(n<0){
            return false
        }
        if(n<3){
            return 1
        }
        var queue = new Queue();
        var index = 0;
        
        //将两个1存入队列之中
        queue.enqueue(1);
        queue.enqueue(1);
        //思路:队列中一直保存两个数 
        while(index<n-2){
            var dequeue=queue.dequeue();
            var head=queue.head();
            var next=dequeue+head;
            queue.enqueue(next);

            index++
        }
        //反回队列尾部数字
        return queue.tail();
    }

    console.log(feibonaqie(5))

以及 可以用队列实现一个杨辉三角

//for加队列实现杨辉三角 n表示行数
    function yanghui(n){
        var queue =new Queue();
        queue.enqueue(1);
        //控制层数
        for(var i=1;i<=n;i++){
            var line="";
            var pre=0;
            // 第二层for循环控制打印第 i 层
            for(var j=1; j<=i;j++){
                var item=queue.dequeue();
                line+=item+"";
                // 计算下一行的内容
                var value=item+pre;
                pre=item;
                //存入的是下一行的数
                queue.enqueue(value);
            }
            //每一层最后一个数字是1,上面的for循环没有计算最后一个数
            queue.enqueue(1);
            console.log(line);
        }
    }
    yanghui(5);
//for+while实现
function  yanghui2(n){
    var queue = new Queue();
    queue.enqueue(1);
    queue.enqueue(0);
    for(var i=1; i<=n; i++){
        var line = "";
        var pre = 0;
        while(true){
            var item = queue.dequeue();
            // 用一个0把每一行的数据分割开,遇到0不输出,
            if(item==0){
                queue.enqueue(1);
                queue.enqueue(0);
                break
            }else {
                // 计算下一行的内容
                line += item + "  "
                var value = item + pre;
                pre = item;
                queue.enqueue(value);
            }
        }
        console.log(line);
    }
}

而我们所用js事件循环就是用到的队列,当我们在浏览器中打开新标签时,就会创建一个任务队列。这是因为每个标签都是单线程处理所有的任务,它被称为事件循环。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值