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

队列定义
队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。
队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
在现实中,最常见的队列的例子就是排队:
js数组实现队列数据结构与练习使用_第1张图片
但是不能插队

下面我们来实现一个队列

//定义一个队列
    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

用队列实现 斐波那契数列

//斐波那契数列
    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

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

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

你可能感兴趣的:(数据结构)