
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef char DataType;
5
6 #define QueueSize 40
7
8 /*
9
10 模运算实现一个闭环
11
12 重点:
13
14 为空:Q.front == Q.rear
15
16 已满:(Q.rear + 1) % QueueSize == Q.front
17
18
19
20 */
21
22 //构造循环队列
23 typedef struct
24 {
25 DataType data[QueueSize];
26 int front, rear;
27 }ScQueue;
28
29 //初始化循环队列
30 void InitScQueue(ScQueue &Q)
31 {
32 Q.front = Q.rear = 0;
33 }
34
35 //判断循环队列是否为空
36 bool ScQueueEmpty(ScQueue Q)
37 {
38 if (Q.front == Q.rear)
39 {
40 return true;
41 }
42 else
43 {
44 return false;
45 }
46 }
47
48 //入队操作--插入队列
49 bool EnterScqueue(ScQueue &Q, DataType x)
50 {
51 //判断队列是否已满
52 if ((Q.rear + 1) % QueueSize == Q.front)
53 {
54 return false;
55 }
56 else
57 {
58 Q.data[Q.rear] = x;
59 //队尾指针+1再取模,用模运算在逻辑上形成了闭环
60 Q.rear = (Q.rear + 1) % QueueSize;
61 return true;
62 }
63 }
64
65 //出队操作--删除队列元素
66 bool DeleteScqueue(ScQueue &Q, DataType &x)
67 {
68 //判断队列是否为空
69 if (Q.front == Q.rear)
70 {
71 return false;
72 }
73 else
74 {
75 x = Q.data[Q.front];
76 //队头指针后移
77 Q.front = (Q.front + 1) % QueueSize;
78 return true;
79 }
80 }
81
82 //读取队头元素
83 bool GetScqueueHead(ScQueue Q, DataType &x)
84 {
85 //判断队列是否为空
86 if (Q.front == Q.rear)
87 {
88 return false;
89 }
90 else
91 {
92 x = Q.data[Q.front];
93 return true;
94 }
95 }
96
97 //清空队列---只要将三者全部置为0即可清空队列
98 void ClearScqueue(ScQueue &Q)
99 {
100 Q.front = 0;
101 Q.rear = 0;
102 }
103
104
105 int main()
106 {
107 char str[] = "ABCDEFGH";
108 char x;
109
110 ScQueue Q;
111 InitScQueue(Q);
112
113
114 for (int i = 0; i < sizeof(str) - 1; i++)
115 {
116 //将字符串中的数据插入队列
117 EnterScqueue(Q, str[i]);
118 }
119
120 DeleteScqueue(Q, x);
121 printf("出队列的元素为:%c\n", x);
122
123 printf("顺序队列中的元素为:");
124 //判断是否队列不为空
125 if (ScQueueEmpty(Q) == false)
126 {
127 //这里循环时要注意用队列的头和尾进行循环
128 for (int i = Q.front; i < Q.rear; i++)
129 {
130 printf("%c", Q.data[i]);
131 }
132 }
133
134
135
136
137 getchar();
138 return 0;
139 }