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

队列算法【基于顺序表的环形队列】

代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*【环形缓冲区(顺序表版本)】*/
typedef struct
{int* data;int size;
}g_tVector;
/* 顺序表的初始化 */
void VectorInit(g_tVector* vector, int len)
{if (NULL == vector)  return;vector->data = (int*)malloc(sizeof(int) * len);vector->size = len;return;
}
/* 顺序表的清理 */
void VectorClear(g_tVector* vector)
{if (NULL == vector)  return;free(vector->data);return;
}
/* 顺序表的写入数据 */
bool VectorWrite(g_tVector* vector, int index , int data)
{if (NULL == vector)  return false;vector->data[index] = data;return true;
}
/* 顺序表的读出数据 */
bool VectorRead(g_tVector* vector, int index, int** data)
{if (NULL == vector)  return false;**data = vector->data[index];return true;
}/************************************************/
typedef struct
{g_tVector* vector;int count, head, tail, len;void (*vectorInit)(g_tVector*, int);void (*vectorClear)(g_tVector*);bool (*vectorWrite)(g_tVector*, int, int);bool (*vectorRead)(g_tVector*, int, int**);
}g_tQueue;/* 环形缓冲区的初始化 */
void QueueInit(g_tQueue* queue, int len)
{if (NULL == queue) return;queue->vector = (g_tVector*)malloc(sizeof(g_tVector));queue->vectorInit = VectorInit;queue->vectorClear = VectorClear;queue->vectorRead = VectorRead;queue->vectorWrite = VectorWrite;queue->vectorInit(queue->vector, len);queue->len = len;queue->head = queue->tail = queue->count = 0;printf("init:%d, %d, %d, %d\r\n", queue->len, queue->count, queue->head, queue->tail);return;
}/* 环形缓冲区申请内存的释放 */
void QueueClear(g_tQueue* queue)
{if (NULL == queue) return;VectorClear(queue->vector);free(queue->vector);free(queue);return;
}bool QueueIsEmpty(g_tQueue* queue)
{if (NULL == queue) return false;return (queue->count == 0);
}bool QueueIsFull(g_tQueue* queue)
{if (NULL == queue) return false;//printf("data:%d, %d\r\n", queue->count, queue->len);return (queue->count == queue->len);
}/* 从环形缓冲区取出数据 */
bool PopQueue(g_tQueue* queue, int* data)
{if ((NULL == queue)|| (NULL == data) || QueueIsEmpty(queue)) return false;queue->vectorRead(queue->vector, queue->head, &data);if (queue->head < queue->len-1)queue->head++;      //头部索引向后移动elsequeue->head = 0;    //头部指向尾部queue->count--;   //环形缓冲区存储的数据量return true;
}
/* 向环形缓冲区压入数据 */
bool PushQueue(g_tQueue* queue, int data)
{if ((NULL == queue) || QueueIsFull(queue)) return false;queue->vectorWrite(queue->vector, queue->tail, data);if (queue->tail < queue->len-1)queue->tail++;elsequeue->tail = 0;queue->count++;return true;
}int main()
{g_tQueue queue;bool ret;int data;QueueInit(&queue, 5);for (int i = 0; i < 6; i++){data = rand() % 100;ret = PushQueue(&queue, data);if (!ret)printf("%d push is error\r\n", i);elseprintf("push %d\r\n", data);}ret = PopQueue(&queue, &data);if (ret)printf("pop data is %d\r\n", data);return 0;
}

运行结果如下所示:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • VMware安装Ubuntu 23.10.1系统图文版
  • 【小白深度学习入门】【1】卷积神经网络CNN 结构、基本原理以及常见问题详解
  • 前端 数值列 禁止输入多个小数点
  • Debian Linux上安装Jumpserver
  • vue-draggable-plus实现某些子元素不被拖拽
  • JS中【querySelectorAll】详解
  • 【Node】【7】函数
  • 8.28-回顾+容器与主机之间的通信+跨主机容器之间的通信
  • NTP简介及相关概念
  • mysql创建存储过程
  • 音频PCM的能量dB计算
  • iOS巨魔商店免越狱作弊解决方案
  • Redis: 用于纯缓存模式需要注意的地方
  • zoom 会议 javascript 转录例子
  • Unity 贴图拷贝与性能对比
  • 07.Android之多媒体问题
  • android 一些 utils
  • CSS3 变换
  • iOS 系统授权开发
  • IOS评论框不贴底(ios12新bug)
  • JavaScript异步流程控制的前世今生
  • Java深入 - 深入理解Java集合
  • leetcode46 Permutation 排列组合
  • React 快速上手 - 07 前端路由 react-router
  • React中的“虫洞”——Context
  • SAP云平台里Global Account和Sub Account的关系
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • Swoft 源码剖析 - 代码自动更新机制
  • windows下如何用phpstorm同步测试服务器
  • 工程优化暨babel升级小记
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Hibernate主键生成策略及选择
  • Nginx实现动静分离
  • ​人工智能书单(数学基础篇)
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #QT(QCharts绘制曲线)
  • $(selector).each()和$.each()的区别
  • $jQuery 重写Alert样式方法
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (12)目标检测_SSD基于pytorch搭建代码
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (55)MOS管专题--->(10)MOS管的封装
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (十一)图像的罗伯特梯度锐化
  • (一)认识微服务
  • **PHP分步表单提交思路(分页表单提交)
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 和 .NET Framework 中的 MEF2