在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素
移动,但是也带来了一个新的问题"假溢出"。
循环队列入队, 队尾循环后移: SQ->rear =(SQ->rea 79438401111 r+1)%Maxsize;
循环队列出队, 队首循环后移: SQ->front =(SQ->front+1)%Maxsize;
队空:SQ.front=SQ.rear; // SQ.rear 和 SQ.front 指向同一个位置
队满: (SQ.rear+1) %Maxsize=SQ.front; // SQ.rear 向后移一位正好是 SQ.front
#include "cstdio"
//循环队列的最大容量
#define max_size 5
typedef struct Queue {
//循环队列中元素类型,我这里直接写int了
// 也可以 typedef int Datatype
int queue[max_size];
// 循环队头指针
int front;
// 循环队尾指针
int rear;
} SeqQueue;
//队列初始化,将循环队列初始化为空队列
bool InitQueue(SeqQueue *sq) {
if (!sq) {
return false;
}
//把对头和队尾指针同时置 0
sq->front = 0;
sq->rear = 0;
return true;
}
//判断队列为空
bool IsEmpty(SeqQueue *sq) {
if (sq->rear == sq->front) {
return true;
}
return false;
}
//判断循环队列是否为满
bool IsFull(SeqQueue *sq) {
if ((sq->rear + 1) % max_size == sq->front) {
return true;
}
return false;
}
//入队,将元素 data 插入到循环队列 SQ 中
int EnterQueue(SeqQueue *sq, int val) {
if (IsFull(sq)) {
printf("无法插入\n");
return 0;
} else {
//在队尾插入元素 data
sq->queue[sq->rear] = val;
//队尾指针循环后移一位
sq->rear = (sq->rear + 1) % max_size;
return 1;
}
}
//出队,将队列中队头的元素 data 出队,出队后队头指针 front 后移一位
int DeleteQueue(SeqQueue *sq, int *data) {
if (IsEmpty(sq) || !sq) {
return 0;
} else {
*data = sq->queue[sq->front];
sq->front = (sq->front + 1) % max_size;
return 1;
}
}
//打印队列中的各元素
void Display(SeqQueue *sq) {
if (IsEmpty(sq) || !sq) {
return;
}
int index = sq->front;
while (index != sq->rear) {
printf("%d, ", sq->queue[index]);
index = (index + 1) % max_size;
}
}
//清空队列
void ClearQueue(SeqQueue *sq) {
if (!IsEmpty(sq)) {
sq->front = 0;
sq->rear = 0;
} else {
printf("已经为空\n");
return;
}
}
//获取队列中元素的个数
int GetLength(SeqQueue *sq) {
if (!IsEmpty(sq))return (sq->rear - sq->front + max_size) % max_size;
else return 0;
}
int main() {
SeqQueue *sq = new SeqQueue;
InitQueue(sq);
//入队
for (int i = 0; i < 7; i++) {
if (EnterQueue(sq, i)) {
printf("%d插入成功\n", i);
} else {
printf("%d插入失败\n", i);
}
}
printf("队列中的元素(总共%d 个):", GetLength(sq));
Display(sq);
printf("\n开始出队\n");
int data = -1;
//出队
for (int i = 0; i < 5; i++) {
if (DeleteQueue(sq, &data)) {
printf("元素%d出队\n", data);
} else {
printf("出队完毕\n");
}
}
printf("出队五个元素后,队列中剩下的元素个数为 %d 个\n",GetLength(sq));
//入队 4 个
for (int i = 0; i < 4; i++) {
EnterQueue(sq, i + 10);
}
printf("入队个元素后,队列中剩下的元素个数为 %d 个\n",GetLength(sq));
Display(sq);
return 0;
}