返回

设计一个高效可靠的循环队列,支持入队、出队和获取队头元素

前端

前言

循环队列是一种先进先出(FIFO)的数据结构,与普通队列不同的是,循环队列中的最后一个元素与第一个元素相连,形成一个环形结构。这种结构允许在队列已满时继续添加元素,而无需重新分配内存空间。循环队列广泛应用于各种场景,如操作系统中的进程调度、网络通信中的数据缓冲等。

实现原理

在JavaScript中,我们可以使用数组来实现循环队列。首先,我们需要定义一个数组来存储队列中的元素,然后定义两个指针,分别指向队头和队尾。当入队时,我们将新元素添加到队尾指针指向的位置,并更新队尾指针指向下一个位置。当出队时,我们将队头指针指向的元素从队列中删除,并更新队头指针指向下一个位置。

代码实现

class CircularQueue {
    constructor(size) {
        this.queue = new Array(size);
        this.head = 0;
        this.tail = 0;
    }

    enqueue(element) {
        if ((this.tail + 1) % this.queue.length === this.head) {
            throw new Error("Queue is full.");
        }

        this.queue[this.tail] = element;
        this.tail = (this.tail + 1) % this.queue.length;
    }

    dequeue() {
        if (this.head === this.tail) {
            throw new Error("Queue is empty.");
        }

        const element = this.queue[this.head];
        this.head = (this.head + 1) % this.queue.length;
        return element;
    }

    peek() {
        if (this.head === this.tail) {
            return null;
        }

        return this.queue[this.head];
    }

    isEmpty() {
        return this.head === this.tail;
    }

    isFull() {
        return (this.tail + 1) % this.queue.length === this.head;
    }

    size() {
        return (this.tail - this.head + this.queue.length) % this.queue.length;
    }
}

// 使用示例

const queue = new CircularQueue(5);

queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);

console.log(queue.size()); // 5

console.log(queue.dequeue()); // 1
console.log(queue.dequeue()); // 2

queue.enqueue(6);

console.log(queue.peek()); // 3

console.log(queue.isEmpty()); // false
console.log(queue.isFull()); // false

queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue();

console.log(queue.isEmpty()); // true

复杂度分析

  • 入队和出队操作的时间复杂度为O(1)。
  • 获取队头元素操作的时间复杂度为O(1)。
  • 判断队列是否为空或已满操作的时间复杂度为O(1)。
  • 获取队列的大小操作的时间复杂度为O(1)。

扩展

  • 循环队列也可以使用链表来实现。
  • 循环队列还可以扩展出双端队列(Deque),双端队列支持从队头或队尾添加或删除元素。

结语

循环队列是一种非常有用的数据结构,在许多场景中都有着广泛的应用。通过本文,读者可以学习如何使用JavaScript实现一个高效可靠的循环队列,并了解循环队列的原理和使用方式。希望本文对读者有所帮助。