一、概念
首先明确循环队列本质上还是队的顺序存储结构,但为了克服一般顺序存储的弊端(假溢出),循环队列在逻辑上,将队的数组空间首尾相连,确保不会有没有被利用的空间。
因为队空和队满都是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
二、代码
2.1 循环队列实现
/*
* 循环队列
* by不吃黑巧克力也能活
*/
#include <iostream>
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");
}
2.2 测试代码:
// 测试
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("出队的数是:%d\n", e);
QueuePrint(Q);
return 0;
}