数据结构与算法-队列



一、队列(Queue)

1.1队列简介

队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out)。

  • 受限之处在于它只允许在表的前端(front)进行删除操作;
  • 在表的后端(rear)进行插入操作;
    在这里插入图片描述

队列的应用:

  • 打印队列:计算机打印多个文件的时候,需要排队打印;
  • 线程队列:当开启多线程时,当新开启的线程所需的资源不足时就先放入线程队列,等待CPU处理;

队列类的实现:

队列的实现和栈一样,有两种方案:

  • 基于数组实现;
  • 基于链表实现;

队列的常见操作:

  • enqueue(element):向队列尾部添加一个(或多个)新的项;
  • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素;
  • front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与Stack类的peek方法非常类似);
  • isEmpty():如果队列中不包含任何元素,返回true,否则返回false;
  • size():返回队列包含的元素个数,与数组的length属性类似;
  • toString():将队列中的内容,转成字符串形式;

1.2基于数组封装队列

/**
 * 
 * Queue-From-Array
 * 
 * */

 
 function Queue(){
	 this.items = [];
	 
	 //1、入列
	 Queue.prototype.enQueue = function(item){
		 this.items.push(item);
	 }
	 
	 // 2、出列
	 Queue.prototype.deQueue = function(){
	 		return this.items.shift();//shift() 移除数组第一个元素
	 }
	 
	 // 3、查看第一个元素
	Queue.prototype.peek = function(){
		 return this.items[0];
	}
	
	// 4、是否为空
	Queue.prototype.isEmpty = function(){
		return this.items.length === 0;
	}
	
	// 5、size
	Queue.prototype.size = function(){
		return this.items.length;
	}
	//6、toString
	Queue.prototype.toString = function(){
		let str = '';
		for (var i = 0; i < this.items.length; i++) {
			str += this.items[i]+" ";
		}
		return str;
	}
	
	// 7、全部出列
	Queue.prototype.allShift = function(){
		let str = '';
		while(!this.isEmpty()){
			str += this.deQueue()+"  ";
		}
		return str;
	}
	
	 
 }
 
 
 let mQueue = new Queue();
 
 mQueue.enQueue('yxh');
 mQueue.enQueue('cjy');
 mQueue.enQueue('wwj');
 mQueue.enQueue('wcc');
 
 console.log(mQueue.toString());
 
 
 
 console.log(mQueue.deQueue());
 
 
 
 console.log(mQueue.toString());
 
 console.log(mQueue.isEmpty());
 
 console.log(mQueue.size());
 
 
 console.log(mQueue.allShift());
 
 

1.3基于链表封装队列

注意此处链表是应用之前写的,
若想了解链表请移步

const { linklist } = require("../../链表/单向链表/demo");

console.log(linklist)

function Queue(){
    this.list = new linklist();


    //入列
    Queue.prototype.enQueue = function (data){
        this.list.append(data);
    }

    //出列
    Queue.prototype.deQueue = function (){
        return this.list.removeAt(0);
    }

    //查看第一个元素
    Queue.prototype.peek = function (){
        return this.list.get(0);
    }

    //size
    Queue.prototype.length = function (){
        return this.list.length;
    }

    //isEmpty
    Queue.prototype.isEmpty = function (){
        return this.list.size() === 0;
    }

    //toString
    Queue.prototype.toString = function (){
        return this.list.toString();
    }

}

// let queue = new Queue();
//
// queue.enQueue("yxh");
// queue.enQueue(520);
// queue.enQueue("哈哈哈");
//
//
// console.log(queue.toString());
//
//
// console.log(queue.deQueue());
//
// console.log(queue.toString());
// console.log(queue.deQueue());
//
// console.log(queue.toString());
// console.log(queue.deQueue());
//
// console.log(queue.toString());
// console.log(queue.deQueue());
//
// console.log(queue.toString());


应用:击鼓传花

注意此处Queue为上面封装的

function PassingGame(mans,num){
	 let mQueue = new Queue();
	 for (var i = 0; i < mans.length; i++){
	 	mQueue.enQueue(mans[i]);
	 }
	 while(mQueue.size() !== 1){
		 for (var i = 0; i < num - 1; i++) {
			mQueue.enQueue(mQueue.deQueue());
		 }
		 mQueue.deQueue();
	 }
	 return mQueue.toString();
 }
 
 
 console.log('胜利者:',PassingGame(['yxh','wwj','cjt','wcc','xed','zjt','drui','gs'],2));
posted on 2021-06-05 10:16  千里码!  阅读(18)  评论(0)    收藏  举报  来源