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

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

  在编写代码的时候尤其需要注意循环队列数组超出下界的情况,而且有一点得说明的是循环队列在初始化的时候指向对头的前指针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  }


 

转载于:https://www.cnblogs.com/IamEasy_Man/archive/2010/07/08/1774017.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值