【原创】循环队列存储数据
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;
}
在编写代码的时候尤其需要注意循环队列数组超出下界的情况,而且有一点得说明的是循环队列在初始化的时候指向对头的前指针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;
}
相关文章推荐
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- 循环队列存储数据
- 数据结构之循环队列(顺序表存储)——C++模板类实现
- 循环队列--队列的顺序存储表示形式[原创]
- 数据结构之循环队列
- 使用堆栈(Stack)来模拟队列(FIFO)功能,要求数据必须存储在堆栈内部.需要实现enqueue(入栈),dequeue(出栈),isEmpty(判空)三个功能,并给出单元测试.
- 队列——顺序存储的循环队列(存储元素为自定义类型)
- 数据结构单链队列——链式存储实现
- 原创 | 入门数据分析--数据存储之常用数据库及区别
- 循环队列的顺序存储
- 数据结构基础-队列(循环队列、链式队列)以及STL中queue的使用
- 存储过程实例 判断临时表是否存在 循环添加主外键两张表数据
- 数据结构之循环队列(面向对象思想c++实现)
- 数据结构——队列及循环队列
- 循环插入数据存储过程
- 存储过程循环table中的数据
- C# 数据结构基础-实现循环队列
- 数据仓库--postgresql for 循环记录完成存储过程总调度
- 数据结构——数组模仿循环队列
- 队列的顺序存储——循环队列