先看代码:
代码文件main.c
1 /*************************************************************************************************************************
2
3 功能:演示循环队列的基本操作
4 1) 循环队列初始化
5 2)入队操作
6 3)出队操作
7 4)判断是否为空队列
8 5)判断队列是否已满
9 6)遍历队列各元素
10 注:为了避免队列空和满两个状态混淆,采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。
11
12 **************************************************************************************************************************/
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <malloc.h>
17 #include <stdbool.h> //注意使用布尔类型时,需要引入此头文件
18
19 /*******************************************************************************************************************
20
21 定义循环队列的结构体
22 注:循环队列是在数组的基础上实现的,所以需要一个指向首元素的指针,另外头和尾用int来表示相对偏移量即可。
23
24 ********************************************************************************************************************/
25 typedef struct Queue
26 {
27 int * qBase;
28 int front;
29 int rear;
30 }QUEUE;
31
32 void initQueue(QUEUE *pq);
33 void enQueue(QUEUE *pq , int value);
34 bool isemptyQueue(QUEUE *pq);
35 bool is_fullQueue(QUEUE *pq);
36 void deQueue(QUEUE *pq , int *value);
37 void traverseQueue( QUEUE *pq);
38
39 /***********************************************
40
41 主函数测试入口
42
43 ************************************************/
44 int main()
45 {
46 int val;
47 QUEUE queue = {NULL,0,0} ;
48 initQueue(&queue);
49 enQueue(&queue,4);
50 enQueue(&queue,5);
51 enQueue(&queue,6);
52 enQueue(&queue,7);
53 enQueue(&queue,72);
54 enQueue(&queue,42);
55
56
57 traverseQueue(&queue);
58 deQueue(&queue , &val);
59 deQueue(&queue , &val);
60
61 traverseQueue(&queue);
62 enQueue(&queue,55);
63 enQueue(&queue,65);
64 traverseQueue(&queue);
65
66
67 return 0;
68 }
69 /************************************
70 初始化一个空的循环队列
71 ************************************/
72 void initQueue(QUEUE *pq)
73 {
74 pq->qBase = (int *)malloc(sizeof(int)*6);
75 if(pq->qBase == NULL)
76 {
77 printf("内存分配失败!\n");
78 exit(-1);
79 }
80 pq->front = pq->rear = 0;
81
82 }
83 /************************************************************
84
85 插入一个新元素
86
87 注:插入前需要先判断该队列是否已满,避免覆盖有效数据。
88
89 ************************************************************/
90
91 void enQueue(QUEUE *pq , int value)
92 {
93
94 if(is_fullQueue(pq))
95 {
96 printf("循环队列已满,拒绝插入%d!\n",value);
97
98 }else
99 {
100 pq->qBase[pq->rear] = value;
101 pq->rear = (pq->rear + 1)%6 ;
102 printf("\n %d 入队 \n" , value);
103
104 }
105 }
106
107 /*************************************
108
109 删除一个元素,并通过指针返回该数
110
111 注:删除前要判断该队列是否为空。
112
113 *************************************/
114
115 void deQueue(QUEUE *pq , int *value)
116 {
117
118 if(isemptyQueue(pq))
119 {
120 printf("循环队列已空!");
121 }else
122 {
123 *value = pq->qBase[pq->front];
124 printf("\n %d 出队 \n",*value);
125 pq->front = (pq->front + 1)%6 ;
126
127 }
128
129 }
130
131 /************************************
132
133 判断循环队列是否为空
134
135 ************************************/
136 bool isemptyQueue(QUEUE *pq)
137 {
138 if(pq->front == pq->rear)
139 {
140 return true;
141 }else
142 return false;
143 }
144
145 /************************************
146 判断循环队列是否已满
147 ************************************/
148 bool is_fullQueue(QUEUE *pq)
149 {
150 if((pq->rear +1)%6 == pq->front)
151 {
152 return true;
153 }else
154 return false;
155 }
156
157 /*************************************
158
159 遍历循环队列中的各元素
160 *************************************/
161 void traverseQueue( QUEUE *pq)
162 {
163 if(isemptyQueue(pq))
164 {
165 printf("循环队列为空!\n");
166 exit(0);
167 }
168 printf("当前循环队列 :\n");
169 printf("front是%d,rear是%d :\n",pq->front,pq->rear);
170
171
172 int tail = pq->front ;
173 while(tail != pq->rear)
174 {
175 printf(" %d ",pq->qBase[tail]);
176 tail = (tail + 1)%6;
177
178 }
179 }
上述代码运行结果如下:
注:
1)、理解循环队列都是在数组的基础上实现的,掌握循环队列的结构体声明
2)、理解front和rear的下一个位置的确定方法,即当前值加1与数组长度求模。
3)、理解基本操作:入队,出队过程中front和rear的变化。