📜  数据结构-循环队列(1)

📅  最后修改于: 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