e[queue->rear] = e;
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
}
复制代码
如下时为满,损失一个空间,不存储元素。方便判满
复制代码
1 //出队
2 void deleteQueue(CirularQueue *queue)
3 {
4 if (queue->front == queue->rear) {
5 puts("队列是空的!");
6 }
7 else
8 {
9 queue->front = (queue->front + 1) % MAX_SIZE;
10 }
11 }
12
13 //遍历
14 void traversal(CirularQueue queue)
15 {
16 int q = queue.front;
17
18 for (int i = 0; i < getLength(queue); i++) {
19 printf("循环队列的第%d个元素为%d\n", i + 1, queue.base[q]);
20 q++;
21 }
22 }
23
24 #endif
复制代码
测试
复制代码
1 #include "Header.h"
2
3 int main(int argc, const char * argv[]) {
4 CirularQueue queue;
5 puts("循环队列初始化:");
6 initQueue(&queue);
7
8 puts("循环队列初始化后长度:");
9 printf("%d\n", getLength(queue));
10
11 puts("循环队列5个元素入队,总长度为5,但是损失一个位置空间,实际存储4个元素。先进先出原则:");
12 puts("循环队列元素0入队");
13 insertQueue(&queue, 0);
14 puts("循环队列元素1入队");
15 insertQueue(&queue, 1);
16 puts("循环队列元素2入队");
17 insertQueue(&queue, 2);
18 puts("循环队列元素3入队");
19 insertQueue(&queue, 3);
20
21 puts("循环队列元素遍历:");
22 traversal(queue);
23
24 puts("循环队列元素继续入队,无法完成:");
25 insertQueue(&queue, 4);
26
27 puts("循环队列元素0出队之后,先进先出原则:");
28 deleteQueue(&queue);
29 traversal(queue);
30
31 puts("循环队列元素1出队之后,先进先出原则:");
32 deleteQueue(&queue);
33 traversal(queue);
34
35 puts("循环队列元素2出队之后,先进先出原则:");
36 deleteQueue(&queue);
37 traversal(queue);
38
39 puts("循环队列元素3出队之后,先进先出原则:");
40 deleteQueue(&queue);
41 traversal(queue);
42
43 puts("4个元素全部删除,循环队列已经空了:");
44 deleteQueue(&queue);
45
46 traversal(queue);
47
48 return 0;
49 }
复制代码
结果;
循环队列初始化:
循环队列初始化后长度:
0
循环队列5个元素入队,总长度为5,但是损失一个位置空间,实际存储4个元素。先进先出原则:
循环队列元素0入队
循环队列元素1入队
循环队列元素2入队
循环队列元素3入队
循环队列元素遍历:
循环队列的第1个元素为0
循环队列的第2个元素为1
循环队列的第3个元素为2
循环队列的第4个元素为3
循环队列元素继续入队,无法完成:
循环队列是满的!
循环队列元素0出队之后,先进先出原则:
循环队列的第1个元素为1
循环队列的第2个元素为2
循环队列的第3个元素为3
循环队列元素1出队之后,先进先出原则:
循环队列的第1个元素为2
循环队列的第2个元素为3
循环队列元素2出队之后,先进先出原则:
循环队列的第1个元素为3
循环队列元素3出队之后,先进先出原则:
4个元素全部删除,循环队列已经空了:
队列是空的!
Program ended with exit code: 0
小结:
若用户需要循环队列,那么要设置队列的最大长度,否则无法完成判断空,如果用户不知道最大长度是多少,那么应该使用链队。队列在程序设计中和栈一样,应用很多,未完待续。