【原创】循环队列存储数据

拜拜、爱过 提交于 2020-02-13 02:13:05

  项目对数据存储和获取有一定的要求,循环队列能解决我的问题,上网查相关的资料,重新了解了一下循环队列。

  在编写代码的时候尤其需要注意循环队列数组超出下界的情况,而且有一点得说明的是循环队列在初始化的时候指向对头的前指针Front和指向队尾的指针Rear初始化为0,循环队列为空的情况只有在Front == Rear下成立,而判断循环队列是否已满需要判断(Rear + 1) % Max_Size == Front,其实循环队列的实现其实就是通过把指针位置对数组大小取模来实现的。在实现循环队列的时候,一般有效的数据个数是Max_Size - 1个,Front所指向的位置存储的数据不作使用,Front + 1所指向的位置存储的是队列首元素,这样可以保证区分队列已满和为空两种情况。

  代码如下:

CirculaerQueue.h

 1 #ifndef _CIRCULARQUEUE_H__
 2 #define _CIRCULARQUEUE_H__
 3 
 4 typedef struct
 5 {
 6     int iTime;
10 }ModelData,*pModelData;
11 
12 typedef struct 
13 {
14     pModelData QueueData;
15     int iFront,iRear;
16     int iMaxNumQueue;
17 }QueueList,*pQueueList;
18 
19 
20 extern BOOL InitQueue(pQueueList& pMyQL,int iMaxNum);
21 
22 extern BOOL IsEmpty(pQueueList pMyQL);
23 
24 extern BOOL IsFull(pQueueList pMyQL);
25 
26 extern BOOL EnterQueue(pQueueList pMyQL,pModelData pMyData);
27 
28 extern BOOL QuitQueue(pQueueList pMyQL,pModelData pMyData);
29 
30 extern void ClearQueue(pQueueList pMyQL);
31 
32 
33 #endif    //END  _CIRCULARQUEUE_H__


CirculaerQueue.cpp:

 

  1 #include "stdafx.h"
  2 #include "CirculaerQueue.h"
  3 
  4 BOOL InitQueue(pQueueList& pMyQL,int iMaxNum)
  5 {
  6     if(pMyQL == NULL)
  7     {
  8         pMyQL = (QueueList*)malloc(sizeof(QueueList));
  9         if(pMyQL)
 10         {
 11             pMyQL->QueueData = (ModelData*)malloc(sizeof(ModelData)*iMaxNum);
 12             if(!(pMyQL->QueueData))
 13             {
 14                 free(pMyQL);
 15                 pMyQL = NULL;
 16                 return FALSE;
 17             }
 18             else
 19             {
 20                 memset(pMyQL->QueueData,0,sizeof(ModelData)*iMaxNum);
 21             }
 22         }
 23         else
 24         {
 25             return FALSE;
 26         }
 27     }
 28 
 29     pMyQL->iMaxNumQueue = iMaxNum;
 30     pMyQL->iRear = pMyQL->iFront = 0;
 31 
 32     return TRUE;
 33 }
 34 
 35 
 36 void ClearQueue(pQueueList pMyQL)
 37 {
 38     if(pMyQL)
 39     {
 40         free(pMyQL);
 41         pMyQL = NULL;
 42         if(pMyQL->QueueData)
 43         {
 44             free(pMyQL->QueueData);
 45             pMyQL->QueueData = NULL;
 46         }
 47     }
 48 }
 49 
 50 
 51 BOOL IsEmpty(pQueueList pMyQL)
 52 {
 53     if(pMyQL)
 54     {
 55         if(pMyQL->iFront == pMyQL->iRear)
 56         {
 57             return TRUE;
 58         }    
 59     }
 60     
 61     return FALSE;
 62 }
 63 
 64 
 65 
 66 BOOL IsFull(pQueueList pMyQL)
 67 {
 68     if(pMyQL)
 69     {
 70         if(pMyQL->iFront == ((pMyQL->iRear + 1% pMyQL->iMaxNumQueue))
 71         {
 72             return TRUE;
 73         }
 74     }
 75     return FALSE;
 76 }
 77 
 78 
 79 
 80 BOOL EnterQueue(pQueueList pMyQL,pModelData pMyData)
 81 {
 82     if(pMyQL)
 83     {
 84         if(!IsFull(pMyQL))
 85         {
 86             if(pMyData)
 87             {
 88                 pMyQL->iRear = (pMyQL->iRear + 1% pMyQL->iMaxNumQueue;
 89                 memcpy(&(pMyQL->QueueData[pMyQL->iRear]),pMyData,sizeof(ModelData));            
 90                 return TRUE;
 91             }
 92         }
 93     }
 94     return FALSE;
 95 }
 96 
 97 
 98 BOOL QuitQueue(pQueueList pMyQL,pModelData pMyData)
 99 {
100     if(pMyQL)
101     {
102         if(!IsEmpty(pMyQL))
103         {
104             if(pMyData)
105             {
106                 memcpy(pMyData,&(pMyQL->QueueData[(pMyQL->iFront + 1% pMyQL->iMaxNumQueue]),sizeof(ModelData));    
107                 pMyQL->iFront = (pMyQL->iFront + 1% pMyQL->iMaxNumQueue;
108                 return TRUE;
109             }
110         }
111     }
112     return FALSE;
113 }


 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!