C数据结构——顺序/循环队列 创建与基本使用

源码+注释

//
// Created by Lenovo on 2022-03-28-上午 9:45.
// 作者:小象
// 版本:1.0
//

#include <stdlib.h>

#define MAXSIZE 1000 // 队列可能达到的最大长度

typedef enum {
    FALSE,
    TRUE
} boolean;

typedef int ElemType;

typedef struct { // 定义
    ElemType *base; // 存储空间的基地址
    int front; // 头指针
    int rear; // 尾指针
} SqQueue;

boolean InitQueue(SqQueue *queue); // 循环队列的初始化

boolean IsFull(SqQueue *queue); // 判队满

boolean EnQueue(SqQueue *queue, ElemType elem); // 循环队列入队列

boolean IsEmpty(SqQueue *queue); // 判队空

boolean DeQueue(SqQueue *queue, ElemType *elem); // 循环队列出队列

boolean QueueLength(SqQueue *queue); // 循环队列长度

ElemType GetHead(SqQueue *queue); // 取循环队列队头元素

/**
 * <h2>循环队列</h2>
 *
 * @return 0
 */
int main() {

    // 以上已做实验验证,这里不再举例

    return 0;

}

// 构造一个空队列 queue
boolean InitQueue(SqQueue *queue) {
    queue->base = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE); // 为队列分配一个最大容量为 MAXSIZE 的数组空间
    if (!(queue->base)) {
        return FALSE; // 存储分配失败
    }
    queue->front = queue->rear = 0; // 头指针和尾指针置为0, 队列为空
    return TRUE;
}

// 尾指针在循环意义上加1 后等于头指针,表明队满
boolean IsFull(SqQueue *queue) {
    return (queue->rear + 1) % MAXSIZE == queue->front; // 循环
}

// 插入元素 elem 为 queue 的新的队尾元素
boolean EnQueue(SqQueue *queue, ElemType elem) {
    if (IsFull(queue)) {
        return FALSE;
    }
    queue->base[queue->rear] = elem; // 新元素插入队尾
    queue->rear = (queue->rear + 1) % MAXSIZE; // 队尾指针加 1
    return TRUE;
}

// 判队空
boolean IsEmpty(SqQueue *queue) {
    return queue->front == queue->rear;
}

// 删除 queue 的队头元素,用 elem 返回其值
boolean DeQueue(SqQueue *queue, ElemType *elem) {
    if (IsEmpty(queue)) {
        return FALSE;
    }
    *elem = queue->base[queue->front]; // 保存队头元素
    queue->front = (queue->front + 1) % MAXSIZE; // 队头指针加 1
    return TRUE;
}

// 返回 queue 的元素个数,即队列的长度
boolean QueueLength(SqQueue *queue) {
    return (queue->rear - queue->front + MAXSIZE) % MAXSIZE;
}

// 返回 queue 的队头元素,不修改队头指针
ElemType GetHead(SqQueue *queue) {
    if (!(IsEmpty(queue))) { // 队列非空
        return queue->base[queue->front]; // 返回队头元素的值,队头指针不变
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丶象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值