侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 128887 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

js数据结构——队列

2024-04-28 星期日 / 0 评论 / 0 点赞 / 2 阅读 / 7392 字

一、 1.创建队列 function Queue(){ var items = []; if(typeof this.enqueue != "function"){

一、

1.创建队列

function Queue(){        var items = [];        if(typeof this.enqueue != "function"){            //进队            Queue.prototype.enqueue = function(element){                items.push(element);            };            //出队            Queue.prototype.dequeue = function(){                return items.shift();            };            //返回队列中的第一个元素            Queue.prototype.front = function(){                return items[0];            };            //判断是否空队            Queue.prototype.isEmpty = function(){                return items.length == 0;            };            //清空队列            Queue.prototype.clear = function(){                items = [];            };            //返回队列大小            Queue.prototype.size = function(){                return items.length;            };            //打印            Queue.prototype.print = function(){                console.log(items.toString());            };        }    }

(1)上面代码利用数组和数组的push()和shift()方法实现进队和出队

2.使用队列 

var queue = new Queue();    //入队并打印    queue.enqueue(5);    queue.enqueue(1);    queue.enqueue(8);    queue.enqueue(2);    queue.enqueue(4);    queue.print();              //5,1,8,2,4    //返回第一个元素并打印    console.log(queue.front()); //5    queue.print();              //5,1,8,2,4    //出队一个元素并打印,输出大小    queue.dequeue();    queue.print();              //1,8,2,4    console.log(queue.size());  //4    //清空队列并判空    queue.clear();    console.log(queue.isEmpty());//true

二、优先队列

1.创建优先队列

所谓优先队列,就是在元素添加和删除的时候是基于优先级的。

1.创建一个元素对象,有两个属性,元素值和元素优先级

2.入队,首先想到,最开始是空队,if(this.empty()),直接入队

3.如果不是空队,先设置找到插入位标记(flag = false),然后遍历已有队列中的元素,比较优先级大小,优先级数值小的(及优先级大的在前)

4.判断条件,如果元素的优先级数值大于队列中元素的优先级数值,进入下一次循环。

5。如果满足元素的优先级数值小于队列中元素的优先级数值,flag置为true,表示已经找到插入位,并用splice方法添加元素.

6.如果flag还是为flase,说明队列中所有元素的优先级数值都比要插入的数值小,所以直接入队就可以了

 function PriorityQueue(){        var items = [];        function QueueElement(element,priority){            this.element = element;            this.priority = priority;        }        if(typeof this.enqueue != "function"){            //进队            PriorityQueue.prototype.enqueue = function(element,priority){                var queueElement = new QueueElement(element,priority);                if(this.isEmpty()){                    items.push(queueElement);                }else{                    var flag = false;                    for(var i = 0;i < items.length;i++){                        if(queueElement.priority < items[i].priority){                            flag = true;                            items.splice(i,0,queueElement);                            break;                        }                    }                    if(!flag){                        items.push(queueElement)                    }                }            };            //出队            PriorityQueue.prototype.dequeue = function(){                return items.shift();            };            //返回队列中的第一个元素            PriorityQueue.prototype.front = function(){                return "->"+items[0].element+","+items[0].priority;            };            //判断是否空队            PriorityQueue.prototype.isEmpty = function(){                return items.length == 0;            };            //清空队列            PriorityQueue.prototype.clear = function(){                items = [];            };            //返回队列大小            PriorityQueue.prototype.size = function(){                return items.length;            };            //重写toString方法            PriorityQueue.prototype.toString = function(){            }            //打印            PriorityQueue.prototype.print = function(){                for(var i = 0;i < items.length;i++){                    console.log("("+items[i].element+","+items[i].priority+")");                }            };        }    }

(1)每次入队的是一个对象,根据priority属性排序,根据element属性取值。

 2.使用优先队列

var queue = new PriorityQueue();    //入队并打印    queue.enqueue(5,1);    queue.enqueue(1,1);    queue.enqueue(8,3);    queue.enqueue(2,5);    queue.enqueue(4,6);    queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)    //返回第一个元素并打印    console.log(queue.front()); //->5,1    queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)    //出队一个元素并打印,输出大小    queue.dequeue();    queue.print();              //(1,1),(8,3),(2,5),(4,6)    console.log(queue.size());  //4    //清空队列并判空    queue.clear();    console.log(queue.isEmpty());//true

(2)值得注意的是,每一次进队一个元素时,前面的总是已经排好序的……。

三、循环队列 

通过将将出队元素进队实现循环队列

所以,循环队列可以基于普通队列实现

例:击鼓传花游戏

function whoWin(nameList,num){        var queue = new Queue();        //初始化队列        for(var i = 0;i < nameList.length;i++){            queue.enqueue(nameList[i])        }        //当队列的大小大于1的时候重复num次,把队首元素放到队尾,然后出队队首元素        var pass = '';        while(queue.size() > 1){            for(var i = 0;i < num;i++) {                queue.enqueue(queue.dequeue());            }            pass = queue.dequeue();            console.log(pass+"在击鼓传花游戏中被淘汰");        }       return queue.front();    }    var names = ['wjj','wjw','wjy','wyc','wak','wp'];    var winner = whoWin(names,7);    console.log("胜利者:"+winner);

(1)上述代码要有“一”中的普通队列代码位基础

(2)如果直接在数组中遍历,很难获取他应该删除的位置,利用队列,每执行一次把元素放到队首,删除时,直接删除队首元素即可。

(3)两个循环条件,一个是queue.size()>0,保证剩余一个元素,另一个i<num,表示设定的循环次数

 

广告 广告

评论区