/** * This is an array-based implementation of a Queue. * A Queue is a data structure that follows the FIFO (First In First Out) principle. * It means that the first element that was added to the queue will be the first one to be removed. * The time complexity of the operations is O(n). */ import { Queue } from './queue' export class ArrayQueue implements Queue { private queue: T[] = [] /** * Returns the number of items in the queue. * * @returns {number} The number of items in the queue. */ length(): number { return this.queue.length } /** * Checks if the queue is empty. * * @returns {boolean} Whether the queue is empty or not. */ isEmpty(): boolean { return this.queue.length === 0 } /** * Adds an item to the queue. * * @param item The item being added to the queue. */ enqueue(item: T): void { this.queue.push(item) } /** * Removes an item from the queue and returns it. * * @throws Queue Underflow if the queue is empty. * @returns The item that was removed from the queue. */ dequeue(): T { if (this.isEmpty()) { throw new Error('Queue Underflow') } return this.queue.shift() as T } /** * Returns the item at the front of the queue. * * @returns The item at the front of the queue or null if the queue is empty. */ peek(): T | null { if (this.isEmpty()) { return null } return this.queue[0] } }