queue.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /**
  2. ******************************** STM32F0xx *********************************
  3. * @文件名 : queue.c
  4. * @作者 : sun
  5. * @库版本 : V1.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年06月10日
  8. * @摘要 :循环队列源文件
  9. ******************************************************************************/
  10. #include "queue.h"
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include "usart.h"
  15. /********************************
  16. 创建空循环队列
  17. ********************************/
  18. sequeue_t * Create_Empty_Sequeue(uint8_t row,uint8_t col)
  19. {
  20. // uint8_t i,j;
  21. uint8_t i;
  22. sequeue_t * sq;
  23. sq = (sequeue_t *)malloc(sizeof(sequeue_t));
  24. if (sq == NULL) {
  25. QUEUE_DEBUG_F("error,sq == NULL\n");
  26. return NULL;
  27. }
  28. memset(sq,0,sizeof(sequeue_t));
  29. sq->data = (uint8_t **)malloc(sizeof(int*) * row); //sizeof(int*),不能少*,一个指针的内存大小,每个元素是一个指针。
  30. memset(sq->data,0,sizeof(int*) * row);
  31. for (i = 0;i < row;i++)
  32. {
  33. sq->data[i] = (uint8_t*)malloc(sizeof(uint8_t ) * col);
  34. if (sq->data[i] == NULL) {
  35. QUEUE_DEBUG_F("error,sq->data[i] == NULL\n");
  36. return NULL;
  37. }
  38. memset(sq->data[i],0,sizeof(uint8_t ) * col);
  39. }
  40. /*
  41. for (i = 0;i < row;i++)
  42. {
  43. for (j = 0;j < col;j++)
  44. {
  45. QUEUE_DEBUG("%p ",&(sq->data[i][j]));
  46. }
  47. QUEUE_DEBUG("\n");
  48. }
  49. */
  50. sq->depth = row;
  51. sq->width = col;
  52. sq->sum = 0;
  53. return sq;
  54. }
  55. /********************************
  56. 检查循环队列是否为空
  57. ********************************/
  58. int8_t Check_Seqeue_Empty(sequeue_t * sq)
  59. {
  60. //return (sq->front == sq->rear);
  61. return (sq->sum == 0);
  62. }
  63. /********************************
  64. 检查循环队列是否为满
  65. ********************************/
  66. int8_t Check_Seqeue_Full(sequeue_t * sq)
  67. {
  68. //return (sq->sum >= SQ_DEPTH);
  69. return (sq->sum >= sq->depth);
  70. }
  71. /********************************
  72. 插入队列,插入1条记录
  73. ********************************/
  74. int8_t En_Queue(sequeue_t *sq ,uint8_t *p,uint8_t sizeof_p,uint8_t l)
  75. {
  76. uint8_t i=0;
  77. uint8_t r=0;
  78. //DEBUG1("En_Queue...\r\n");
  79. if((sq==NULL) || (p==NULL) || (l>=sq->width)) //参数合法判断
  80. return 0;
  81. //DEBUG1("En_Queue...\r\n");
  82. if(Check_Seqeue_Full(sq)) //满队列判断
  83. return 0;
  84. //DEBUG1("En_Queue...\r\n");
  85. r = (sq->rear+1) % (sq->depth); //循环存储
  86. sq->data[r][0] = l; //长度
  87. for(i=0;i<l;i++){ //记录
  88. if((i>sizeof_p-1)|(i>sq->width-2))
  89. break;
  90. sq->data[r][i+1] = p[i];
  91. }
  92. sq->rear = r; //更新入队标记
  93. sq->sum++; //更新总数标记
  94. QUEUE_DEBUG1("En_Queue...SQ=0x%08x,sq->rear =%d,sq->sum=%d\r\n",sq,sq->rear,sq->sum);
  95. return l; //返回插入的记录长度
  96. }
  97. /********************************
  98. 出队列,读取1条记录,队列改变
  99. ********************************/
  100. int8_t De_Queue(sequeue_t * sq,uint8_t *p,uint8_t sizeof_p,uint8_t *l )
  101. {
  102. uint8_t i=0;
  103. uint8_t f=0;
  104. if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
  105. return 0;
  106. if(Check_Seqeue_Empty(sq)) //空队列判断
  107. return 0;
  108. f = (sq->front+1) % (sq->depth);
  109. *l = sq->data[f][0];
  110. for(i=0;i<*l;i++)
  111. {
  112. if((i>sizeof_p-1)|(i>sq->width-2))
  113. break;
  114. p[i] = sq->data[f][i+1];
  115. }
  116. //val = sq->data[sq->front] ;
  117. //printf("p| %p ",&(sq->data[sq->front]));
  118. sq->front = f; //更新出队标记
  119. sq->sum--; //更新总数标记
  120. QUEUE_DEBUG1("De_Queue...SQ=0x%08x,sq->front=%d,sq->sum=%d\r\n",sq,sq->front,sq->sum);
  121. return 1;
  122. }
  123. /********************************
  124. 读取队列,读取1条记录,队列不改变
  125. ********************************/
  126. int8_t Read_Queue(sequeue_t * sq,uint8_t *p,uint8_t *l)
  127. {
  128. uint8_t i=0;
  129. uint8_t f=0;
  130. if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
  131. return 0;
  132. if(Check_Seqeue_Empty(sq)) //空队列判断
  133. return 0;
  134. f = (sq->front+1) % (sq->depth);
  135. *l = sq->data[f][0];
  136. for(i=0;i<*l;i++)
  137. p[i] = sq->data[f][i+1];
  138. //val = sq->data[sq->front] ;
  139. //printf("p| %p ",&(sq->data[sq->front]));
  140. //sq->front = f; //更新出队标记
  141. //sq->sum--; //更新总数标记
  142. return 1;
  143. }
  144. /********************************
  145. 添加1条空记录到队列,记录第0个元素代表长度,初始长度为0
  146. ********************************/
  147. int8_t Add_Blank_Queue(sequeue_t *sq)
  148. {
  149. uint8_t i=0;
  150. uint8_t r=0;
  151. if(sq==NULL) //参数合法判断
  152. return 0;
  153. if(Check_Seqeue_Full(sq)) //满队列判断
  154. return 0;
  155. r = (sq->rear+1) % (sq->depth); //循环存储
  156. sq->data[r][0] = 0; //长度
  157. for(i=1;i<sq->width-1;i++) //记录内容清理
  158. sq->data[r][i] = 0;
  159. sq->rear = r; //更新入队标记
  160. sq->sum++; //更新总数标记
  161. return 1; //返回插入的记录长度
  162. }
  163. /********************************
  164. 更新最新1条记录内容,记录尾元添加1个元素,且长度加1
  165. ********************************/
  166. uint8_t Update_Queue(sequeue_t *sq ,uint8_t mode,uint8_t val)
  167. {
  168. uint8_t l=0;
  169. uint8_t r;
  170. uint8_t m;
  171. m = mode;
  172. if(sq==NULL) //参数合法判断
  173. return 1;
  174. if(Check_Seqeue_Full(sq)) //满队列判断
  175. return 1;
  176. r = (sq->rear+1) % (sq->depth); //队列尾
  177. if(m==0){ //注,当前操作的记录是无效的,记录的长度加1,追加数据
  178. l=sq->data[r][0]+1;
  179. if(l>=sq->width-1){ //记录超过宽度
  180. sq->data[r][0] = 0;
  181. return 1;
  182. }
  183. sq->data[r][l] = val;
  184. sq->data[r][0] = l;
  185. }
  186. if(m==1){ //当前记录,由无效状态变为有效状态,更新rear和sum
  187. sq->rear = r;
  188. sq->sum++;
  189. }
  190. return 0;
  191. }