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