示例说明
实现固定容量循环缓冲区,O(1) push 和 read,用于流式窗口统计。本示例属于数据完整性场景,提供可直接复制使用的typescript代码片段,附带边界条件与使用注意事项。
技术要点
- head 和 tail 指针取模实现环形
- push 满时驱逐最旧元素返回
- toArray 按逻辑顺序读取不依赖物理
代码解读
上述代码实现了固定容量循环缓冲区的核心逻辑。实现固定容量循环缓冲区,O(1) push 和 read,用于流式窗口统计。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。head 和 tail 指针取模实现环形,push 满时驱逐最旧元素返回。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解固定容量循环缓冲区的适用场景与限制条件。toArray 按逻辑顺序读取不依赖物理。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
export class CircularBuffer<T>{private buffer:(T|undefined)[];private head=0;private tail=0;private count=0;constructor(private capacity:number){this.buffer=new Array(capacity);}push(item:T):T|undefined{const evicted=this.isFull()?this.buffer[this.head]:undefined;this.buffer[this.tail]=item;this.tail=(this.tail+1)%this.capacity;if(this.isFull())this.head=(this.head+1)%this.capacity;else this.count++;return evicted;}read():T|undefined{if(this.isEmpty())return undefined;const item=this.buffer[this.head];this.buffer[this.head]=undefined;this.head=(this.head+1)%this.capacity;this.count--;return item;}isFull(){return this.count===this.capacity;}isEmpty(){return this.count===0;}size(){return this.count;}toArray():T[]{const result:T[]=[];for(let i=0;i<this.count;i++)result.push(this.buffer[(this.head+i)%this.capacity]as T);return result;}}