首先明确循环队列本质上还是队的顺序存储结构,但为了克服一般顺序存储的弊端(假溢出),循环队列在逻辑上,将队的数组空间首尾相连,确保不会有没有被利用的空间。
因为队空和队满都是Q.rear = Q.front, 因此这里采用牺牲一个单元来区分队空和队满
- 判空条件:Q.rear = Q.front
- 队满:(Q.rear + 1)% MaxSize == Q.front
- 入队时: Q.rear = (Q.rear + 1) % MaxSize
- 出队: Q.front = (Q.front + 1)% MaxSize
- 队列长度:(Q.rear + MaxSize - Q.front) % MaxSize
#include2.2 测试代码:using namespace std; #define MaxSize 50 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef struct { ElemType data[MaxSize]; int front, rear; } SqQueue; // 初始化栈 void InitQueue(SqQueue &Q) { Q.rear = Q.front = 0; // 初始化队首队尾标记 } // 判空 int isEmpty(SqQueue Q) { if (Q.front == Q.rear) return TRUE; return FALSE; } // 入队 int EnQueue(SqQueue &Q, ElemType x) { // 队满-报错 if ((Q.rear + 1) % MaxSize == Q.front) return FALSE; // 队不满-入队 else { Q.data[Q.rear] = x; Q.rear = (Q.rear + 1) % MaxSize; } } // 出队 int DeQueue(SqQueue &Q, ElemType &e) { // 队空-报错 if (Q.rear == Q.front) return FALSE; // 队空-出队 else { e = Q.data[Q.front]; Q.front = (Q.front + 1) % MaxSize; return TRUE; } } // 打印队列 void QueuePrint(SqQueue Q) { for (int i = Q.front; i != Q.rear; i = (i + 1) % MaxSize) { printf("%d ", Q.data[i]); } printf("n"); }
// 测试
int main() {
SqQueue Q;
InitQueue(Q);
// 入队
EnQueue(Q, 1);
EnQueue(Q, 2);
EnQueue(Q, 3);
EnQueue(Q, 4);
EnQueue(Q, 5);
QueuePrint(Q);
int e;
DeQueue(Q, e);
printf("出队的数是:%dn", e);
QueuePrint(Q);
return 0;
}
2.3 输出结果:



