队列的概念
概念性的就写简单点吧
队列也是一种线性表,先进先出。可以理解为排队打饭,排到前面的人先打饭,后来的人在先来的人后面排着,先来的人打了,后来的人再打。
队列的实现
class Queue{
constructor(n) {
this.arr = [];
this.head = 0;
this.tail = 0;
this.length = n;
}
push(val){
if(this.full()) return -1;
this.arr[this.tail] = val;
this.tail ++;
return val;
}
pop(){
if(this.empty()) return -1;
const val = this.arr[this.head];
this.head++;
return val;
}
empty(){
return this.head === this.tail;
}
full(){
return this.tail === this.length;
}
}
const queue = new Queue(5);
这样的队列会存在问题,当进行了一系列入队出队的操作之后,发现队列满了,但实际上队列中还有位置。
const queue = new Queue(5);
for(let i =0 ;i<6;i++){
queue.push(i);
}
console.log(queue.full()); //true
for(let i =0 ;i<6;i++){
queue.pop();
}
console.log(queue.full(),queue.empty()); // true true
那这样的问题怎么解决呢?
循环队列
上面的问题是因为出队之后的空间被浪费了,那么我们只需要在队列伪溢出之后,将新的元素插入到队首就可以了,可以理解为首尾相连的队列,把这样的队列称为循环队列。
class Queue{
constructor(n) {
this.arr = [];
this.head = 0;
this.tail = 0;
this.length = n;
this.count = 0;
}
push(val){
if(this.full()) return -1;
this.arr[this.tail] = val;
this.count++;
this.tail ++;
// if(this.full()) return val;
if(this.tail === this.length) this.tail = 0;
return val;
}
pop(){
if(this.empty()) return -1;
const val = this.arr[this.head];
this.count--;
this.head++;
// if(this.empty()) return val;
if(this.head === this.length) this.head = 0;
return val;
}
empty(){
return this.count === 0;
}
full(){
return this.count === this.length;
}
size(){
return this.count
}
}
const queue = new Queue(5);
for(let i =0 ;i<6;i++){
queue.push(i);
}
console.log(queue.full()); //true
for(let i =0 ;i<6;i++){
queue.pop();
}
console.log(queue.full(),queue.empty()); // false true