📅  最后修改于: 2023-12-03 14:54:56.501000             🧑  作者: Mango
循环队列是一种基于数组的线性数据结构,它使用前后指针来实现元素的出队入队操作,相较于普通队列,循环队列在操作效率上更为高效。
循环队列需要用到两个指针:front指向队首元素,rear指向队尾元素的下一个位置。这样当front == rear时,队列为空,当(front + 1) % 数组长度 == rear时,队列为满。
为了实现出队入队操作,循环队列采用了取模操作,即将front和rear都按照数组长度取模,使得它们都在0到数组长度之间循环。
下面是循环队列的基本操作:
#define MAXSIZE 100 // 定义队列的最大长度
typedef struct {
int *base; // 用于存放队列元素的数组
int front; // 队首指针
int rear; // 队尾指针
} SqQueue;
// 初始化队列
void InitQueue(SqQueue *Q) {
Q->base = (int *) malloc(MAXSIZE * sizeof(int)); // 分配数组空间
Q->front = 0;
Q->rear = 0;
}
// 判断队列是否为空
bool IsEmpty(SqQueue Q) {
if (Q.front == Q.rear)
return true;
else
return false;
}
// 判断队列是否已满
bool IsFull(SqQueue Q) {
if ((Q.rear + 1) % MAXSIZE == Q.front)
return true;
else
return false;
}
// 入队操作
bool EnQueue(SqQueue *Q, int e) {
if (IsFull(*Q))
return false;
Q->base[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位
return true;
}
// 出队操作
bool DeQueue(SqQueue *Q, int *e) {
if (IsEmpty(*Q))
return false;
*e = Q->base[Q->front];
Q->front = (Q->front + 1) % MAXSIZE; // 队首指针向后移动一位
return true;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 100
typedef struct {
int *base;
int front;
int rear;
} SqQueue;
void InitQueue(SqQueue *Q) {
Q->base = (int *) malloc(MAXSIZE * sizeof(int));
Q->front = 0;
Q->rear = 0;
}
bool IsEmpty(SqQueue Q) {
if (Q.front == Q.rear)
return true;
else
return false;
}
bool IsFull(SqQueue Q) {
if ((Q.rear + 1) % MAXSIZE == Q.front)
return true;
else
return false;
}
bool EnQueue(SqQueue *Q, int e) {
if (IsFull(*Q))
return false;
Q->base[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE;
return true;
}
bool DeQueue(SqQueue *Q, int *e) {
if (IsEmpty(*Q))
return false;
*e = Q->base[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return true;
}
int main() {
SqQueue Q;
InitQueue(&Q);
EnQueue(&Q, 1);
EnQueue(&Q, 2);
EnQueue(&Q, 3);
int e;
DeQueue(&Q, &e);
printf("%d\n", e);
DeQueue(&Q, &e);
printf("%d\n", e);
DeQueue(&Q, &e);
printf("%d\n", e);
return 0;
}
输出结果:
1
2
3