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

中国建设监理工程协会网站北京信息网

中国建设监理工程协会网站,北京信息网,营销咨询公司排名前十,手机淘宝网页关于自定义循环队列的实现原理和要点可以参见之前的博文系列#xff1a;循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构#xff0c;为什么还要单独实现循环队列#…关于自定义循环队列的实现原理和要点可以参见之前的博文系列循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构为什么还要单独实现循环队列 之所以使用自定义循环队列出发点还是基于我们在实际应用中对于数据处理各种各样的需求。使用自定义数据结构的好处就在于可以更加灵活的处理各种数据增加自己需要的接口。然而弊端就是你的 code 可能会引入各种未知的 Bug。所以在满足我们使用前提的场景下使用上述已有数据结构等是比较推荐的如果满足不了实际项目需求再通过自定义的方式等实现是我们理想的一种选择。 二、什么场景需要使用自定义循环队列 对于数据的处理要求比较灵活比如我们需要开发一个安卓服务器程序需要不断处理每个客户端的请求以及完成与客户端的交互。发送来的数据需要及时处理但同时数据以自定义格式进行传输包头长度数据包尾校验。如上格式服务器端需要不断将接收的数据进行缓存与解析如果未满一帧那么需要缓存到下次数据接收过来再进行解析。这时我们需要批量从队列读取数据以及如果一帧数据不完全将读取的数据复原到队列中更改队列当前读位置的功能。此时就可以考虑自己实现队列满足这些特殊的需求。 三、循环队列的特点与要素 1、先进先出FIFO 2、队列首尾元素位置 3、常用队列操作初始化、销毁、遍历、读写等 四、源码实现 为便于使用这里将该循环队列以类的方式实现 /** Copyright (c) 2017, SoldierJazz. All rights reserved.* Use is subject to license terms.**/package com.exmple.java.text;/*** DataQueue 类实现为FIFO循环队列** p 使用前需要根据实际需求为队列分配合理的队列空间大小** 创建一个4K空间的队列如下所示** DataQueue mdataqueue new DataQueue(4096);** p 更多使用信息可以参考引用该类的例程有关问题可发送到* SoldierJazz163.com 寻求支持。** author SoldierJazz* version 1.0.0*/public class DataQueue {Queue q null;public class Queue {byte[] data null;int read;int write;int size;int space;}Object mSemaphore new Object();DataQueue(int size) {q new Queue();Queue_Init(q, size);}/*** 返回当前队列可用数据量** param q 目标队列**/int Avail(Queue q) {return q.size - q.space;}/*** 初始化队列** param q 目标队列* * param size 队列分配内存大小**/void Queue_Init(Queue q, int size) {synchronized (mSemaphore) {q.data new byte[size];q.read 0;q.write 0;q.size size;q.space size;}}/*** 销毁队列** param q 目标队列**/void Queue_Destroy(Queue q) {synchronized (mSemaphore) {q.read q.write 0;q.space q.size;}}/*** 判断当前队列是否为空** param q 目标队列** return true表示队列为空brfalse表示队列不为空**/boolean Queue_Empty(Queue q) {return (q.space q.size);}/*** 判断当前队列是否已满** param q 目标队列** return true表示队列已满brfalse表示队列未满**/boolean Queue_Full(Queue q) {return (q.space 0);}/*** 写一个byte到目标队列** param q 目标队列* * param val 写入的byte值** return true表示写入成功brfalse表示写入失败**/boolean AddQueue(Queue q, byte val) {if (!Queue_Full(q)) {q.data[q.write] val;q.write (q.write 1) % q.size;q.space--;return true;} return false;}/*** 从队列中读取一个字节** param q 目标队列* * param data 读取的字节** return true表示读取成功brfalse表示读取失败**/boolean DelQueue(Queue q, Byte data) {if (!Queue_Empty(q)) {data q.data[q.read];q.read (q.read 1) % q.size;q.space;return true;}return false;}/*** 批量写入长度为len的字节到队列** param q 目标队列* * param data 写入的byte数组* * param len 写入的数组长度** return 成功写入的字节数量**/int WriteQueue(Queue q, byte[] data, int len){int ret 0;int rest q.size - q.write;synchronized (mSemaphore) {if (!Queue_Full(q)) {if (q.space len) {ret len;if (rest len) {System.arraycopy(data, 0, q.data, q.write, len);q.write (q.write len) % q.size;q.space - len;} else {System.arraycopy(data, 0, q.data, q.write, rest);q.write 0;System.arraycopy(data, rest, q.data, 0, len - rest);q.write len -rest;q.space - len;}} else {ret q.space;if (rest q.space) {System.arraycopy(data, 0, q.data, q.write, q.space);q.write (q.write q.space) % q.size;q.space 0;} else {System.arraycopy(data, 0, q.data, q.write, rest);q.write 0;System.arraycopy(data, rest, q.data, 0, q.space - rest);q.write q.space -rest;q.space 0;}} }return ret;}}/*** 从队列中恢复长度len个字节的数据** param q 目标队列* * param len 要恢复的长度** return 成功恢复的字节数**/int RecoverReadQueue(Queue q, int len) {int ret 0;int rest q.read;synchronized (mSemaphore) {if (q.space len)ret len;elseret q.space;if (rest ret) {q.read - ret;} else {q.read q.size - (ret - rest);}q.space - ret;return ret;}}/*** 从队列中读取len个字节数据到data数组中** param q 目标队列* * param data 用于存放数据的目标数组* * param start 拷贝至目标数组的起始位置* * param len 读取的长度* * return 成功读取的字节数**/int ReadQueue(Queue q, byte[] data, int start, int len) {int rest q.size - q.read;int ret 0;synchronized (mSemaphore) {if (!Queue_Empty(q)) {if (Avail(q) len) {ret len;if (rest len) {System.arraycopy(q.data, q.read, data, start, len);q.read (q.read len) % q.size;q.space len;} else {System.arraycopy(q.data, q.read, data, start, rest);q.read 0;System.arraycopy(q.data, 0, data, start rest, len - rest);q.read len -rest;q.space len;}return len;} else {ret Avail(q);if (rest Avail(q)) {System.arraycopy(q.data, q.read, data, start, Avail(q));q.read (q.read Avail(q)) % q.size;q.space q.size;} else {System.arraycopy(q.data, q.read, data, start, rest);q.read 0;System.arraycopy(q.data, 0, data, start rest, Avail(q) - rest);q.read Avail(q) -rest;q.space q.size;}}} return ret;}} }以上内容为使用该类及相关方法的定义比较简单看注解即可。下面针对该类做一个使用与测试程序public void TestDataQueue() {DataQueue dataq new DataQueue(100);byte[] a1 {1, 2, 3, 4, 5, 6};byte[] a2 {7, 8, 9, 10};byte[] b new byte[10];int nread 0;dataq.WriteQueue(dataq.q, a1, a1.length);nread dataq.ReadQueue(dataq.q, b, 0, 3);System.out.println(length of queue: dataq.Avail(dataq.q));for (int i 0; i nread; i) {System.out.printf(byte[%d]: %d\n, i, b[i]);}dataq.WriteQueue(dataq.q, a2, a2.length);System.out.println(length of queue: dataq.Avail(dataq.q));nread dataq.ReadQueue(dataq.q, b, 0, dataq.Avail(dataq.q));System.out.println(length of queue: dataq.Avail(dataq.q));for (int i 0; i nread; i) {System.out.printf(byte[%d]: %d\n, i, b[i]);}}public static void main(String args[]) {test t new test();t.TestDataQueue();}运行结果如下所示有疑问或者问题就给我邮件或者评论吧觉得有用就点赞吧~:-D
http://wiki.neutronadmin.com/news/330090/

相关文章:

  • 有没有好的网站可以学做头发卖高仿名牌手表网站
  • 网站恶意注册湖北襄阳网站建设
  • 自己的域名搭建网站wordpress 连接微信
  • 宠物网站页面设计创意国外微信小程序优秀案例
  • 专业做网文的网站好现在网站用什么语言做最好
  • 淄博建设工程学校官方网站网站开发工具报告
  • 南昌网站建设和推广广州海珠区房价2023年最新房价
  • 网站建设后期费用单页网站设计制作
  • 合肥网站关键词优化品牌建设和市场营销的区别
  • 专门做环保设备的网站seo企业网站优化
  • 普通营业执照有做网站条件吗wordpress自动添加视频
  • 网站开发模板用什么wordpress电商推广插件
  • 免费cms网站管理系统北京知名网站建设公司
  • 额尔古纳网站建设价格手机商城下载
  • 网站推广软文选择天天软文三亚用什么软件约
  • 网站建设前期准备合肥软件开发
  • 台州网站制作方案wordpress 会员支付
  • 烟台网架公司深圳优化公司样高粱seo
  • 做的好点的外贸网站有哪些怎样看一个网站的浏览量
  • 值得买网站模板网站服务器租用还是托管呢
  • 库尔勒网站建设临沂建设质量监督站网站
  • 网站icp备案有效时间电商网站如何备案
  • 儿童 网站 设计建设网站学什么语言
  • 在线做mtv网站电商详情页模板免费下载
  • html手机网站开发后端网站建设内容与实现功能
  • 江门企业免费建站游戏ui设计
  • 松江网站设计自建网站平台哪个好
  • 中国城乡与住房建设部网站首页美工所需要的网站
  • 新网站该如何做网站优化呢霍山网站建设
  • 网站制作公司下浙江省建设安监站网站