数组实现循环队列
queue.h
#include <stdbool.h>
#ifndef MGRAPH_QUEUE_H
#define MGRAPH_QUEUE_H
typedef int ElementType;
typedef int Position;
typedef struct QNode * PtrToQNode;
struct QNode {
ElementType * Data; // 存储元素的数组
Position Front, Rear; // 队列的、尾指针
int MaxSize; // 队列的最大容量
};
typedef PtrToQNode Queue;
Queue CreateQueue(int MaxSize);
bool IsFull(Queue Q);
bool AddQ(Queue Q, ElementType X);
bool IsEmpty(Queue Q);
ElementType DeleteQ(Queue);
#endif //MGRAPH_QUEUE_H
queue.c
#include "queue.h"
#include <stdlib.h>
#include <stdio.h>
#define ERROR -1
Queue CreateQueue(int MaxSize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
return Q;
}
bool IsFull(Queue Q)
{
return ((Q->Rear + 1) % Q->MaxSize == Q->Front); // 这里我们选择少用一个空间, 当队列尾指针加 1 就会从后面赶上头指针时 --> 队满
}
bool AddQ(Queue Q, ElementType X)
{
if (IsFull(Q)) {
printf("队列满");
return false;
} else {
Q->Rear = (Q->Rear + 1) % Q->MaxSize; // 尾指针向后移动一个位置
Q->Data[Q->Rear] = X;
return true;
}
}
bool IsEmpty(Queue Q)
{
return (Q->Front == Q->Rear); // 头指针和尾指针相等时, 队列为空, 注意与队列满的时候作区分
}
ElementType DeleteQ(Queue Q)
{
if (IsEmpty(Q)) {
printf("队列空");
return ERROR;
} else {
Q->Front = (Q->Front + 1) % Q->MaxSize;
return Q->Data[Q->Front]; // 虽然这里 Q->Front 位置上的数据还在, 但是其实它已经被删除了, 因为我们是选择的少用一个空间
}
}
参考: 浙江大学陈越数据结构图部分, 教材 --> 《数据结构第二版》(陈越)