【JS数据结构与算法】队列(Queue)、队列的封装及其应用

目录

1、什么是队列?

2、队列的封装

3、队列的检验

4、队列的应用


1、什么是队列?

队列(Queue)是一种特殊的线性表先进先出(FIFO,First In First Out)

特殊之处在于它只允许在表的前端(front)进行删除操作,

而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

进行插入操作的端称为队尾,进行删除操作的端称为队头

2、队列的封装

function Queue(){
      // 属性
      this.items  = [];

      // 对象内称之为方法,而不是函数
      // Methods: 和某一个对象实例有联系
      // function: 
      // this.push = function(this){

      // }   

      // 需要利用原型,这种方法是共享的,也会节省更多的内存空间并且效率更高一点,相当于给整个类添加一个方法,而上面的方式相当于给某一个对象的实例添加一个方法,在JavaScript中是基于对象。

      // 队列的相关操作
      // 1、封装push函数,将元素加入到队列中。
      Queue.prototype.enqueue = function(element){
        this.items.push(element);
      }

      // 2、从队列中删除前端的元素
      Queue.prototype.dequeue = function(){
        return this.items.shift();
      }

      // 3、查看前端的元素
      Queue.prototype.front = function(){
        return this.items[0];
      }

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

      // 5、获取队列中的元素个数
      Queue.prototype.size = function(){
        return this.items.length;
      }

      // 6、toString 方法 
      Queue.prototype.toString = function(){
        var resultString = '';
        for (var i = 0; i < this.items.length; i++) {
          resultString += this.items[i] + ' ';
        }
        return resultString;  
      }

    }

3、队列的检验

    var q = new Queue();
    // 依次放入20 100 10 60
    q.enqueue(20);
    q.enqueue(100);
    q.enqueue(10);
    q.enqueue(60);   //20 100 10 60

    // 输出队列
    alert(q);

    // 删除前端的一个元素
    q.dequeue();  //100 10 60
    alert(q);

    // 获取队头的一个元素
    alert(q.front());   //100


    // 获取队列的大小
    alert(q.size());  //3
    alert(q.toString());  //100 10 60

    // 判断队列是否为空
    alert(q.isEmpty());  //false

4、队列的应用

击鼓传花。

原始游戏规则:有N个人围成一个圈传一束花,有一个人在旁边击鼓,当鼓声停止时,花落在谁的手上谁就淘汰,最后留下来的那个人就获胜。

改编规则: 有N个人围成一个圈从1开始报数,规定当报到数字k的人淘汰,下一轮从1开始,最后留下来的那个人就获胜。

 

代码实现:

function Queue(){
      // 属性
      this.items  = [];

      // 队列的相关操作
      // 1、封装push函数,将元素加入到队列中。
      Queue.prototype.enqueue = function(element){
        this.items.push(element);
      };

      // 2、从队列中删除前端的元素
      Queue.prototype.dequeue = function(){
        return this.items.shift();
      };

      // 3、查看前端的元素
      Queue.prototype.front = function(){
        return this.items[0];
      };

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

      // 5、获取队列中的元素个数
      Queue.prototype.size = function(){
        return this.items.length;
      };

      // 6、toString 方法 
      Queue.prototype.toString = function(){
        var resultString = '';
        for (var i = 0; i < this.items.length; i++) {
          resultString += this.items[i] + ' ';
        }
        return resultString;  
      };

    }

    // 实现击鼓传花的代码

    function passGrame(nameList,num){
      // 1、定义队列对象
      var queue = new Queue();

      // 2、将每个人加入到队列中
      for (var i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i]);
      }

      // 3、将对应的人移除
      while(queue.size() > 1){

        // 3.1、将每一次前端移除的人排到队列的后端
        for (var i = 0; i < num - 1; i++) {
          queue.enqueue(queue.dequeue());
        }

      
        // 3.2、每数到数字num的时候就删除
        queue.dequeue();
      }
      alert(queue.size()); 
      var endName = queue.front();
      alert('最后剩下来的人' + endName);


      // 4、返回最后剩下的那个人
      return nameList.indexOf(endName);
      
    }

    var nameList = ['Lily', 'Lucy', 'Tom', 'Lilei', 'Petter'];
    alert(passGrame(nameList,3));

总结:与栈不同的是,队列出队是在队头,而栈是在栈顶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值