Queue.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*********************************************************************************************************
  2. * 模块名称:Queue.c
  3. * 摘 要:Queue模块
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "Queue.h"
  20. /*********************************************************************************************************
  21. * 宏定义
  22. *********************************************************************************************************/
  23. /*********************************************************************************************************
  24. * 枚举结构体
  25. *********************************************************************************************************/
  26. /*********************************************************************************************************
  27. * 内部变量定义
  28. *********************************************************************************************************/
  29. /*********************************************************************************************************
  30. * 内部函数声明
  31. *********************************************************************************************************/
  32. /*********************************************************************************************************
  33. * 内部函数实现
  34. *********************************************************************************************************/
  35. /*********************************************************************************************************
  36. * API函数实现
  37. *********************************************************************************************************/
  38. /*********************************************************************************************************
  39. * 函数名称:InitQueue
  40. * 函数功能:初始化队列
  41. * 输入参数:pQue-结构体指针,即指向结构体变量的地址,pBuf-队列的元素存储区地址,len-队列的容量
  42. * 输出参数:pQue-结构体指针,即指向结构体变量的地址
  43. * 返 回 值:void
  44. * 创建日期:2021年07月01日
  45. * 注 意:
  46. *********************************************************************************************************/
  47. void InitQueue(StructCirQue* pQue, DATA_TYPE* pBuf, short len)
  48. {
  49. short i;
  50. pQue->front = 0; //队头
  51. pQue->rear = 0; //队尾
  52. pQue->bufLen = len; //缓冲区长度(队列容量)
  53. pQue->elemNum = 0; //当前队列中元素的个数
  54. pQue->pBuffer = pBuf; //指针变量pBuf赋给指针变量pQue->pBuffer
  55. for(i = 0; i < len; i++)
  56. {
  57. pQue->pBuffer[i] = 0; //对指针变量pQue->pBuffer所指向的元素均赋初值0
  58. }
  59. }
  60. /*********************************************************************************************************
  61. * 函数名称:ClearQueue
  62. * 函数功能:清队列
  63. * 输入参数:pQue-结构体指针,即指向结构体变量的地址
  64. * 输出参数:pQue-结构体指针,即指向结构体变量的地址
  65. * 返 回 值:void
  66. * 创建日期:2021年07月01日
  67. * 注 意:
  68. *********************************************************************************************************/
  69. void ClearQueue(StructCirQue* pQue)
  70. {
  71. pQue->front = 0; //队头
  72. pQue->rear = 0; //队尾
  73. pQue->elemNum = 0; //当前队列中元素的个数
  74. }
  75. /*********************************************************************************************************
  76. * 函数名称:QueueEmpty
  77. * 函数功能:判断队列是否为空,1为空,0为非空
  78. * 输入参数:pQue-结构体指针,即指向结构体变量的地址
  79. * 输出参数:pQue-结构体指针,即指向结构体变量的地址
  80. * 返 回 值:返回队列是否为空,1为空,0为非空
  81. * 创建日期:2021年07月01日
  82. * 注 意:
  83. *********************************************************************************************************/
  84. unsigned char QueueEmpty(StructCirQue* pQue)
  85. {
  86. return(0 == pQue->elemNum);
  87. }
  88. /*********************************************************************************************************
  89. * 函数名称:QueueLength
  90. * 函数功能:返回队列中元素个数
  91. * 输入参数:pQue-结构体指针,即指向结构体变量的地址
  92. * 输出参数:pQue-结构体指针,即指向结构体变量的地址
  93. * 返 回 值:队列中元素的个数
  94. * 创建日期:2021年07月01日
  95. * 注 意:
  96. *********************************************************************************************************/
  97. short QueueLength(StructCirQue* pQue)
  98. {
  99. return(pQue->elemNum);
  100. }
  101. /*********************************************************************************************************
  102. * 函数名称:EnQueue
  103. * 函数功能:插入len个元素(存放在起始地址为pInput的存储区中)到队列
  104. * 输入参数:pQue-结构体指针,即指向结构体变量的地址,pInput-待入队数组的地址,len-期望入队元素的数量
  105. * 输出参数:pQue-结构体指针,即指向结构体变量的地址
  106. * 返 回 值:成功入队的元素的数量
  107. * 创建日期:2021年07月01日
  108. * 注 意:每次插入一个元素,rear自增,当rear的值大于等于队列容量bufLen时,rear值变为0。需要注意的是,当队
  109. * 列中的元素数量加上待写入的元素数量超过队列容量时,队列允许写入的元素数量等于队列中的元素数量+新写
  110. * 入的元素数量-队列的容量,即EnQueue函数对于超出元素采取不理睬的态度。
  111. *********************************************************************************************************/
  112. short EnQueue(StructCirQue* pQue, DATA_TYPE* pInput, short len)
  113. {
  114. short wLen = 0; //待入队的元素有len个,wLen从0增加到len-1
  115. while((pQue->elemNum < pQue->bufLen) && (wLen < len))
  116. {
  117. pQue->pBuffer[pQue->rear] = pInput[wLen]; //将待入队的第wLen个元素pInput[wLen]插入队列
  118. pQue->rear++; //队尾rear自增,即指向队尾元素的下一个位置
  119. if(pQue->rear >= pQue->bufLen)
  120. {
  121. pQue->rear = 0; //如果队尾元素的下一个位置为pQue->bufLen,则rear指向队头,循环体现在此处
  122. }
  123. wLen++;
  124. pQue->elemNum++; //当前队列中的元素总数
  125. }
  126. return wLen; //如果返回值wLen为0,表示没有元素入队
  127. }
  128. /*********************************************************************************************************
  129. * 函数名称:DeQueue
  130. * 函数功能:从队列中取出len个元素,放入起始地址为pOutput的存储区
  131. * 输入参数:pQue-结构体指针,即指向结构体变量的地址,len-预期出队元素的数量
  132. * 输出参数:pQue-结构体指针,即指向结构体变量的地址,pOutput-出队元素存放的数组的地址
  133. * 返 回 值:成功出队的元素的数量
  134. * 创建日期:2021年07月01日
  135. * 注 意:每次取出一个元素,front自增,当front的值大于等于队列容量bufLen时,front值变为0。需要特别注意,从
  136. * 队列中读取元素的前提是队列中需要至少有一个元素,当期望取出的元素数量len小于或等于队列中元素的数量
  137. * 时,可以按期望取出len个元素,否则,只能取出队列中已有的所有元素。
  138. *********************************************************************************************************/
  139. short DeQueue(StructCirQue* pQue, DATA_TYPE* pOutput, short len)
  140. {
  141. short rLen = 0; //期望取出len个元素,最终能取出rLen个元素
  142. while((pQue->elemNum > 0) && (rLen < len))
  143. {
  144. pOutput[rLen] = pQue->pBuffer[pQue->front];
  145. pQue->front++;
  146. if( pQue->front >= pQue->bufLen )
  147. {
  148. pQue->front = 0;//如果队头元素的下一个位置为pQue->bufLen,则front指向队头,循环体现在此处
  149. }
  150. rLen++;
  151. pQue->elemNum--; //当前队列中的元素总数
  152. }
  153. return rLen; //如果返回值rLen为0,表示队列中没有元素
  154. }