数据结构-队列

队列

队列常用方法:

 function Queue() {
            //创建一个数组来存放队列的数据
            this.dataStore = [];
            //添加数据
            this.enqueue = enqueue;
            //删除数据
            this.dequeue = dequeue;
            //获得队列头部数据
            this.front = front;
            //获得队列尾部数据
            this.back = back;
            //判断队列是否为空
            this.empty = empty;
        }

一.基本方法及扩展

1.数据插入     

数据的插入队列是从尾部插入,但是我们也可以自己创建函数使数据从头部插入

 //进队列,从尾部添加数据
    endeque1(element) {
            this.dataStore[this.length()]=element;
    }

    //进队列,从头部添加数据
    endeque2(element){
        //将整体数据往后移动一位
        for(let i=this.dataStore.length-1;i>=0;i--){
            this.dataStore[i+1]=this.dataStore[i];
        }
        //将element赋值给头部数据
        this.dataStore[0]=element;
    }

2.删除数据

 // 从头部删除数据,并获得这个数据
    dedeque1(){
        var head=this.dataStore[0];
        for(let i=1;i<this.length();i++){
            this.dataStore[i-1]=this.dataStore[i];
        }
        //将最后一个数据的内容置空
        this.dataStore[this.length]=null;
        //将队列长度减一
        this.dataStore.length--;
        //返回头部数据
        return head;
    }

    // 从尾部删除数据,并获得这个数据
    dedeque2() {
        let back=this.dataStore[this.dataStore.length-1];
        //将最后一个数据置空
        this.dataStore[this.dataStore.length-1]=null;
        //数组长度减一
        this.dataStore.length--;
        //返回尾部数据
        return back;
    }

3.获得队列头部和尾部数据

 //获得队列最前面的数据
    front() {
        return this.dataStore[0];
    }

    // 获得队列最后面的数据
    back () {
        return this.dataStore[this.dataStore.length-1];
    }

4.遍历队列

  //遍历队列内容,这里采用回调机制
    forEach(call) {
        for(var i=0;i<this.length();i++){
            call(this.dataStore[i]);
        }
    }


//

//这里是forEach调用的情况

  //栈遍历
       deque.forEach(function (item) {
        console.log(item);
    })

二.应用及案例

方块舞问题:当男男女女来到舞池,他们按照自己的性别排成两队。当舞池中有地方空出来时,选两个队列中的第一个人组成舞伴。他们身后的人各自向前移动一位,变成新的队首。当一对舞伴迈入舞池时,主持人会大声喊出他们的名字。当一对舞伴走出舞池,且两排队伍中有任意一队没人时,主持人也会把这个情况告诉大家。

应用代码:

 //需分配的数组
var array=[
        {sex:"F",name:"Allison McMillan"},
        {sex:"M",name:"Frank Opitz"},
        {sex:"M",name:"Mason McMillan"},
        {sex:"M",name:"Clayton Ruff"},
        {sex:"F",name:"Cheryl Ferenback"},
        {sex:"M",name:"Raymond Williams"},
        {sex:"F",name:"Jennifer Ingram"},
        {sex:"M",name:"Bryan Frazer"},
        {sex:"M",name:"David Durr"},
        {sex:"M",name:"Danny Martin"},
        {sex:"F",name:"Aurora Adney"}
    ]

    //分配方法
    function select(array) {
        //创建两个队列分别存放男生和女生
        var male=new Queue();
        var female=new Queue();
        //将数组里面的数据分别存入相应的队列中
        for(var i=0;i<array.length;i++){
            if(array[i].sex=="M"){
                male.enqueue(array[i]);
            }else{
                female.enqueue(array[i]);
            }
        }

        var index=0;
        //男生和女生队列进行配对,因为dequeue1()函数是从队列头部获得数据,并删除数据
        while(male.length()>0&&female.length()>0){
            console.log(male.dequeue1().name+"   AND   "+female.dequeue1().name);一个
            //如果其中的一个队列已经全部删除完了,则返回结束语句
           if(male.length()==0||female.length()==0)
               console.log("结束");
        }

    }
    
    //调用方法

   select(array);

另一种方法:

 var array=[
        "F Allison McMillan",
        "M Frank Opitz",
        "M Mason McMillan",
        "F Clayton Ruff",
        "F Cheryl Ferenback",
        "M Raymond Williams",
        "F Jennifer Ingram",
        "F Bryan Frazer",
        "F David Durr",
        "M Danny Martin",
        "F Aurora Adney"
    ]

    //创建两个队列分别存储男生和女生
    var female=new Queue();
    var male=new Queue();

    //数组中的男生和女生分别装进对应的队列中
    for(var i=0;i<array.length;i++){
        //1,去掉收尾空格
        array[i]=array[i].trim();
        //2,返回数组第一个字符,charAt函数是返回字符串中的指定位置的字符
        var sex=array[i].charAt(0);
        if(sex=="F"){
            // substring函数是取字符串的指定长度
            female.enqueue(array[i].substring(2,array[i].length));
        }else{
            male.enqueue(array[i].substring(2,array[i].length));
        }
    }

    //同时取出两个队列的头部进行配对
    while(!female.empty()&&!male.empty()){
        female.dequeue();
        male.dequeue();
    }

    // 判断是男生还是女生缺人
    if(female.empty()){
        console.log("女方缺人!");
    }
    else if(male.empty()){
        console.log("男方缺人!");
    }

再进行更改一下换成es6的代码形式:

 //创建人的类,里面包含性别和名字
    class Person{
        constructor (sex,name) {
            this.sex=sex;
            this.name=name;
        }
    }
    //创建两个队列分别存储男生和女生
    let female=new Queue();
    let male=new Queue();

    //遍历数组, 数组中的男生和女生分别装进对应的队列中
    array.forEach(function (value) {
        //1,去掉收尾空格
        value=value.trim();
        //2,获得性别
        let sex=value.charAt(0);
        if(sex=="F"){
            // substring函数是取字符串的指定长度
            female.enqueue(value.substring(2,value.length));
        }else{
            male.enqueue(value.substring(2,value.length));
        }
    })

    //同时取出两个队列的头部进行配对
    while(!female.empty()&&!male.empty()){
        female.dequeue();
        male.dequeue();
    }

    // 判断是男生还是女生缺人
    if(female.empty()){
        console.log("女方缺人!");
    }
    else if(male.empty()){
        console.log("男方缺人!");
    }

以上内容,均为本人学习时的总结,因为初学,所以有不对的地方望指正与谅解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值