循环队列的Typescript实现
export default class RoundQueue<V> {
get [Symbol.toStringTag]() {return 'RoundQueue'}
[Symbol.toPrimitive](hint: string): unknown {
if (hint === 'string') return `RoundQueue: [ ${this._queue} ]`;
else throw new Error('RoundQueue不支持转换为 ' + hint + ' 类型');
}
toString() {return 'RoundQueue: ' + this._queue.toString()}
private readonly _queue: Array<V | undefined>
private readonly _maxNumber: number
private _front = 0
private _rear = 0
constructor(private readonly _queueLength: number) {
this._maxNumber = _queueLength + 1;
this._queue = Array(this._maxNumber);
}
get capacity(): number {return this._queueLength}
get length(): number {return (this._rear + this._maxNumber - this._front) % this._maxNumber}
isEmpty(): boolean {return this._front === this._rear}
isFull(): boolean {return (this._rear + 1) % this._maxNumber === this._front}
clear(): void {
this._queue.fill(undefined)
this._front = this._rear = 0;
}
popHead(): V | undefined {
if (this.isEmpty()) return undefined;
else {
const el = this._queue[this._front];
this._queue[this._front] = undefined;
this._front = (this._front + 1) % this._maxNumber;
return el;
}
}
push(element: V, autoCover: boolean = true): void {
if (this.isFull()) {
if (autoCover) {
this._queue[this._front] = undefined;
this._front = (this._front + 1) % this._maxNumber;
} else throw new Error('RoundQueue.push Error: 队列已满,无法继续push');
}
this._queue[this._rear] = element;
this._rear = (this._rear + 1) % this._maxNumber;
}
getHead(): V | undefined {
if (this.isEmpty()) return undefined;
else return this._queue[this._front];
}
getEnd(): V | undefined {
if (this.isEmpty()) return undefined;
else return this._queue[(this._rear + this._maxNumber - 1) % this._maxNumber];
}
getElement(index: number): V {
if (index >= this.length) throw new Error('RoundQueue.getElement Error: index索引越界');
return this._queue[(this._front + index) % this._maxNumber] as V;
}
}
功能测试
const queue = new RoundQueue<number>(10);
for (let i = 0; i < 10; i++) {
queue.push(i);
console.log('queue = ', queue.toString());
console.log('queue.getHead() = ', queue.getHead());
console.log(`queue[${i}] = ${queue.getElement(i)}`);
console.log('queue.getEnd() = ', queue.getEnd());
}
for (let i = 0; i < 10; i++) {
queue.push(i * 10);
console.log('queue = ', queue.toString());
console.log('queue.getHead() = ', queue.getHead());
console.log(`queue[${i}] = ${queue.getElement(i)}`);
console.log('queue.getEnd() = ', queue.getEnd());
}