数据结构与算法-队列
一、队列(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));

浙公网安备 33010602011771号