数组实现循环队列

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 位置上的数据还在, 但是其实它已经被删除了, 因为我们是选择的少用一个空间
    }
}

参考: 浙江大学陈越数据结构图部分, 教材 --> 《数据结构第二版》(陈越)

原文地址:https://www.cnblogs.com/fanlumaster/p/14016183.html