队列

130 阅读1分钟

队列的概念

概念性的就写简单点吧
队列也是一种线性表,先进先出。可以理解为排队打饭,排到前面的人先打饭,后来的人在先来的人后面排着,先来的人打了,后来的人再打。

队列的实现

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