项目对数据存储和获取有一定的要求,循环队列能解决我的问题,上网查相关的资料,重新了解了一下循环队列。
在编写代码的时候尤其需要注意循环队列数组超出下界的情况,而且有一点得说明的是循环队列在初始化的时候指向对头的前指针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__
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 }
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 }