您的位置:首页 > 其它

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

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

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

typedef struct
{
pModelData QueueData;
int iFront,iRear;
int iMaxNumQueue;
}QueueList,*pQueueList;

extern BOOL InitQueue(pQueueList& pMyQL,int iMaxNum);

extern BOOL IsEmpty(pQueueList pMyQL);

extern BOOL IsFull(pQueueList pMyQL);

extern BOOL EnterQueue(pQueueList pMyQL,pModelData pMyData);

extern BOOL QuitQueue(pQueueList pMyQL,pModelData pMyData);

extern void ClearQueue(pQueueList pMyQL);

#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 {
if(pMyQL)
{
if(!IsEmpty(pMyQL))
{
if(pMyData)
{
memcpy(pMyData,&(pMyQL->QueueData[(pMyQL->iFront + 1) % pMyQL->iMaxNumQueue]),sizeof(ModelData));
pMyQL->iFront = (pMyQL->iFront + 1) % pMyQL->iMaxNumQueue;
return TRUE;
}
}
}
return FALSE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: