第五章 队列

来源:互联网 发布:淘宝正品aj篮球鞋店铺 编辑:程序博客网 时间:2024/06/14 05:55

什么是队列?

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列和栈的区别

栈:后进先出,只允许在栈顶进行插入和删除。
队列:先进先出,在队尾进行插入,在对头进行删除。

一个用数组实现的队列

  function Queue(){            this.datastore=[];            this.enqueue=enqueue;  //入队            this.dequeue=dequeue;  //出队            this.front=front;//返回队头元素            this.back=back;//返回队尾元素            this.toString=toString;//返回队列内所有元素            this.empty=empty;//检查队列是否为空            this.count=count;//返回队列的长度    }    function enqueue(element){        this.datastore.push(element);    }    function dequeue(){       return this.datastore.shift();    }    function front(){        return this.datastore[0];    }    function back(){        return this.datastore[this.datastore.length-1]    }    function toString(){        var string="";        for(var i=0;i<this.datastore.length;i++){            string+=this.datastore[i]+'\n'        }        return string;    }    function count(){        return this.datastore.length;    }    function empty(){        if(this.datastore.length==0){            return true        }        else{            return false        }    }

unshift:在数组最开始插入一个元素(返回数组第一位);
shift:删除数组第一位

使用队列

方块舞的舞伴分配问题

队列经常用于模拟排队的人,可以用队列来模拟跳方块舞的人。
当男生女生来到舞池,他们按自己的性别排成两排,当舞池中有地方空出来时,选两个队列中的第一个人组成舞伴。他们身后的人各自向前移动一位,变成新的队首。当一对舞伴进入舞池时,主持人通报他们的名字。当一对舞伴走出舞池,且两排队列中有任意一对没人时,主持人也会把情况通报给大家。
先将男生女生的名字存在文件中。

var string=’F Allison \n M frank \n M mson \n M clayton \n F chert \n F aurora’; //模拟前来跳舞的人

 function Dance(name,sex){        this.name=name;        this.sex=sex    }//将舞者的姓名和性别存入数组 var female=new Queue(); var male=new Queue();     //将所有舞者按照先后顺序推入不同性别的队列    function getDance(male,female){        var _dance=string.split('\n');        var _people=[];        for(var i=0;i<_dance.length;i++){            _people[i]=_dance[i].trim()//删除前后空格        }        for(var j=0;j<_people.length;j++){            var dancer=_people[j].split(' ');            var sex=dancer[0];            var name=dancer[1];            if(sex=='M'){                male.enqueue(new Dance(name,sex)) //将存放个人信息的对象推入队列            }            else{               female.enqueue(new Dance(name,sex))            }        }    }
   //宣布配对结果    function dance(){     while(male.count()>0&&female.count()>0){             var fpeople=female.dequeue().name;             var mpeople=male.dequeue().name;             console.log(fpeople+"和"+mpeople);     }    }

对数据进行排序

基数排序(这里只考虑小于100的数字):
 对于 0~99 的数字,基数排序将数据集扫描两次。第一次按个位上的数字进行排序,第二
 次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。假设有
 如下数字:
 91, 46, 85, 15, 92, 35, 31, 22
 经过基数排序第一次扫描之后,数字被分配到如下盒子中:
 bin 0:
bin 1: 91, 31
bin 2: 92, 22
bin 3:
bin 4:
bin 5: 85, 15, 35
bin 6: 46
bin 7:
bin 8:
bin 9:
 根据盒子的顺序,对数字进行第一次排序的结果如下:
 91, 31, 92, 22, 85, 15, 35, 46
 然后根据十位上的数值再将上次排序的结果分配到不同的盒子中:
 bin 0:
bin 1:15
bin 2: 22
bin 3: 31,35
bin 4: 46
bin 5:
bin 6:
bin 7:
bin 8: 85
bin 9: 91,92
 最后,将盒子中的数字取出,组成一个新的列表,该列表即为排好序的数字:
 15, 22, 31, 35, 46, 85, 91, 92 

使用队列代表盒子,我们可以实现这个算法。主程序:

  //使用队列进行排序    function distribute(queue,nums,n,digit){  //队列数组,排序数的数组,数组个数,基数             for(var i=0;i<n;i++){                if(digit==1){                    queue[nums[i]%10].enqueue(nums[i]);                }                 else{                    queue[Math.floor(nums[i]/10)].enqueue(nums[i]);                }             }    }    function dispArray(arr){       console.log(arr);    }    function collect(queue,nums){        var j=0;       for(var i=0;i<10;i++){           while(!queue[i].empty()){               nums[j++]=queue[i].dequeue();           }       }    }    var queue=[],nums=[];    for(var i=0;i<10;i++){        queue[i]=new Queue();        nums[i]=Math.floor(Math.random()*100);    }      dispArray(nums);      distribute(queue,nums,10,10);      collect(queue,nums);      dispArray(nums);
原创粉丝点击