当前位置: 首页 > news >正文

数据结构和算法篇-环形缓冲区

完整实现

package com.madooei.cb.circulards;import com.madooei.cb.exception.EmptyException;public class CircularBuffer<T> {private T[] data;private int numElements;private int writePos; // 写指针(可认为是队尾)private int readPos; // 读指针(可认为是队首)// Constructor: create buffer with given capacitypublic CircularBuffer(int capacity){this.data = (T[])new Object[capacity];this.numElements = 0;this.writePos = 0;this.readPos = 0;}// Add element to buffer (overwrites oldest if full)public void write(T element){writePos = (readPos + numElements) % data.length;data[writePos] = element;if (isFull()) {// 当缓冲区已满时,写入新元素不仅要前移写指针,还需要**同步前移读指针**,以确保新的写入位置始终有效,// 并维持先进先出的顺序。readPos = (readPos + 1) % data.length;}else {numElements++;}}// Remove and return oldest elementpublic T read(){if (isEmpty()) {throw new EmptyException("You can not read from empty circular buffer");}T elemnt = data[readPos];readPos = (readPos + 1) % data.length;numElements--;return elemnt;}// Check if buffer is emptypublic boolean isEmpty() {return numElements == 0;}// Check if buffer is fullpublic boolean isFull(){return numElements >= data.length;}// Get current number of elementspublic int size(){return numElements;}// 查看当前队首的元素,不删除public T peek(){if (isEmpty()) {throw new EmptyException("You can not peek from empty circular buffer");}return data[readPos];}
}

测试用例

package com.madooei.cb.circulards;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;public class CircularBufferTest {@Testpublic void test(){CircularBuffer<String> buffer = new CircularBuffer<>(3);buffer.write("A");buffer.write("B");buffer.write("C");// Buffer: [A, B, C] (full)Assertions.assertEquals("A", buffer.peek());buffer.write("D");  // Overwrites "A"// Buffer: [D, B, C] conceptually, but A is overwrittenAssertions.assertEquals("B", buffer.peek());String first = buffer.read();  // Returns "B"Assertions.assertEquals("B", first);Assertions.assertEquals("C", buffer.peek());String second = buffer.read(); // Returns "C"Assertions.assertEquals("C", second);// Buffer now contains just "D"buffer.write("E");buffer.write("F");Assertions.assertEquals("D", buffer.peek());buffer.write("G");Assertions.assertEquals("E", buffer.peek());}
}

环形缓冲区示例用法

CircularBuffer<String> buffer = new CircularBuffer<>(3);buffer.write("A");
buffer.write("B");
buffer.write("C");
// Buffer: [A, B, C] (full)buffer.write("D");  // Overwrites "A"
// Buffer: [D, B, C] conceptually, but A is overwrittenString first = buffer.read();  // Returns "B"
String second = buffer.read(); // Returns "C"
// Buffer now contains just "D"buffer.write("E");
buffer.write("F");
// Buffer: [D, E, F]

示例追踪

CircularBuffer<String> buffer = new CircularBuffer<>(3);数组:[][][]
写指针`back`:0
读指针`front`:0
numElements:0buffer.write("A");
数组:[A][][]
写指针`back`:1
读指针`front`:0
numElements:1buffer.write("B");
数组:[A][B][]
写指针`back`:2
读指针`front`:0
numElements:2buffer.write("C");
// Buffer: [A, B, C] (full)
数组:[A][B][C]
写指针`back`:0
读指针`front`:0
numElements:3buffer.write("D");  // Overwrites "A"
数组:[D][B][C]
写指针`back`:1 // 前移写指针
读指针`front`:1 // 前移读指针
numElements:3// Buffer: [D, B, C] conceptually, but A is overwrittenString first = buffer.read();  // Returns "B"
数组:[D][null][C]
写指针`back`:1
读指针`front`:2 // 前移读指针
numElements:2String second = buffer.read(); // Returns "C"
数组:[D][null][null]
写指针`back`:1
读指针`front`:0 // 前移读指针
numElements:1
// Buffer now contains just "D"buffer.write("E");
数组:[D][E][null]
写指针`back`:2
读指针`front`:0
numElements:2buffer.write("F");
数组:[D][E][F]
写指针`back`:0
读指针`front`:0
numElements:3
// Buffer: [D, E, F]buffer.write("G");
数组:[G][E][F]
写指针`back`:1
读指针`front`:1 // 前移读指针
numElements:3
// Buffer: [G, E, F]
http://www.dtcms.com/a/481613.html

相关文章:

  • iOS 26 性能分析深度指南 包含帧率、渲染、资源瓶颈与 KeyMob 协助策略
  • vs网站建设弹出窗口代码c网页视频下载神器哪种最好
  • Chrome性能优化秘籍
  • 【ProtoBuffer】protobuffer的安装与使用
  • Jmeter+badboy环境搭建
  • ARM 总线技术 —— AMBA 入门
  • 【实战演练】基于VTK的散点凹包计算实战:从代码逻辑到实现思路
  • Flink 状态设计理念(附源码)
  • 23种设计模式——备忘录模式(Memento Pattern)
  • 【LeetCode】73. 矩阵置零
  • 网站开发教材男通网站哪个好用
  • 《3D草原场景技术拆解:植被物理碰撞与多系统协同的6个实战方案》
  • 软件测试—BUG篇
  • OpenAI系列模型介绍、API使用
  • 做网站的可以信吗深圳商城网站建设
  • 关于使用docker部署srs服务器的相关指令
  • 基于M序列编码的水下微弱目标检测方法
  • Ubuntu SSH 免密码登陆
  • vue前端面试题——记录一次面试当中遇到的题(8)
  • FastbuildAI后端WebModule模块注册分析
  • 南昌网站排名网站站群建设方案
  • day9 cpp:运算符重载
  • Qoder上线提示词增强功能,将开发者从 “提示词“ 的负担中解放出来
  • 「机器学习笔记15」深度学习全面解析:从MLP到LSTM的Python实战指南
  • 在ARM版MacBook上构建lldb-mi
  • php网站后台搭建html代码大全简单
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十一)MySQL数据库主从复制
  • 云手机的真实体验感怎么样
  • 广州微网站建设信息电商如何做
  • 架设一个网站腾讯网站建设推广