数据结构与算法学习笔记八---顺序队列的表示和实现(C语言)

目录

前言

1.顺序队列的描述

2.队列的顺序表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.空队列

6.队列长度

7.获取队头

8.入队

9.出队

 10.遍历队列

11.完整代码


前言

    本篇博客介绍栈和队列的表示和实现。

1.顺序队列的描述

图1.顺序队列的描述

2.队列的顺序表示和实现

1.定义

#define MAXQueueSIZE 6 // 最大队列长度
typedef int Status;
typedef int ElemType;
typedef struct {
    ElemType *base; // 存储空间基地址
    int front;      // 头指针
    int rear;       // 尾指针
} SqQueue;

2.初始化

        队列初始化的时候,队头和队尾指针均为0

// 队列初始化
Status initSqQueue(SqQueue *sqQueue) {
    sqQueue->base = (ElemType *)malloc(sizeof(ElemType) * MAXQueueSIZE);
    if (!sqQueue->base) { // 内存分配失败
        return 0;
    }
    sqQueue->front = sqQueue->rear = 0;
    return 1;
}

3.销毁

          释放顺序队列存储空间

// 销毁队列
void destroySqQueue(SqQueue *sqQueue) {
    free(sqQueue->base);
}

4.清空

// 清空队列
void clearSqQueue(SqQueue *sqQueue) {
    sqQueue->front = sqQueue->rear = 0;
}

5.空队列

        队头和队尾相同的时候为空队列。

// 判断队列是否为空
Status isEmptySqQueue(SqQueue *sqQueue) {
    return sqQueue->front == sqQueue->rear;
}

6.队列长度

        比较栈顶和栈顶的指针

// 获取队列长度
int sqQueueLength(SqQueue *sqQueue) {
    return sqQueue->rear - sqQueue->front;
}

7.获取队头

        获取队头元素。

// 获取队列的队首元素
Status getSqQueueHead(SqQueue *sqQueue, ElemType *element) {
    if (isEmptySqQueue(sqQueue)) {
        return 0; // 队列为空
    }
    *element = sqQueue->base[sqQueue->front];
    return 1; // 成功获取队首元素
}

8.入队

// 入队
Status enSqQueue(SqQueue *sqQueue, int element) {
    if (sqQueue->rear == MAXQueueSIZE) { // 队满
        return 0;
    }
    sqQueue->base[sqQueue->rear] = element;
    sqQueue->rear++;
    return 1;
}

9.出队

// 出队列
Status deSqQueue(SqQueue *sqQueue, int *element) {
    if (isEmptySqQueue(sqQueue)) { // 队列为空
        return 0;
    }
    *element = sqQueue->base[sqQueue->front];
    sqQueue->front++;
    return 1;
}

 10.遍历队列

// 遍历顺序队列
void traverseSqQueue(SqQueue *sqQueue) {
    for (int i = sqQueue->front; i < sqQueue->rear; i++) {
        printf("%d\t", sqQueue->base[i]);
    }
    printf("\n");
}

11.完整代码

#include <stdio.h>
#include <stdlib.h>

#define MAXQueueSIZE 6 // 最大队列长度
typedef int Status;
typedef int ElemType;
typedef struct {
    ElemType *base; // 存储空间基地址
    int front;      // 头指针
    int rear;       // 尾指针
} SqQueue;

// 队列初始化
Status initSqQueue(SqQueue *sqQueue) {
    sqQueue->base = (ElemType *)malloc(sizeof(ElemType) * MAXQueueSIZE);
    if (!sqQueue->base) { // 内存分配失败
        return 0;
    }
    sqQueue->front = sqQueue->rear = 0;
    return 1;
}

// 销毁队列
void destroySqQueue(SqQueue *sqQueue) {
    free(sqQueue->base);
}

// 清空队列
void clearSqQueue(SqQueue *sqQueue) {
    sqQueue->front = sqQueue->rear = 0;
}

// 判断队列是否为空
Status isEmptySqQueue(SqQueue *sqQueue) {
    return sqQueue->front == sqQueue->rear;
}

// 获取队列长度
int sqQueueLength(SqQueue *sqQueue) {
    return sqQueue->rear - sqQueue->front;
}

// 获取队列的队首元素
Status getSqQueueHead(SqQueue *sqQueue, ElemType *element) {
    if (isEmptySqQueue(sqQueue)) {
        return 0; // 队列为空
    }
    *element = sqQueue->base[sqQueue->front];
    return 1; // 成功获取队首元素
}

// 入队
Status enSqQueue(SqQueue *sqQueue, int element) {
    if (sqQueue->rear == MAXQueueSIZE) { // 队满
        return 0;
    }
    sqQueue->base[sqQueue->rear] = element;
    sqQueue->rear++;
    return 1;
}

// 出队列
Status deSqQueue(SqQueue *sqQueue, int *element) {
    if (isEmptySqQueue(sqQueue)) { // 队列为空
        return 0;
    }
    *element = sqQueue->base[sqQueue->front];
    sqQueue->front++;
    return 1;
}

// 遍历顺序队列
void traverseSqQueue(SqQueue *sqQueue) {
    for (int i = sqQueue->front; i < sqQueue->rear; i++) {
        printf("%d\t", sqQueue->base[i]);
    }
    printf("\n");
}

int main(int argc, const char *argv[]) {
    SqQueue sqQueue;
    printf("顺序队列初始化中...\n");
    if (initSqQueue(&sqQueue)) {
        printf("队列初始化成功!\n");
    }

    printf("\n入队列测试...\n");
    for (int i = 1; i <= 7; i++) {
        if (enSqQueue(&sqQueue, i)) {
            printf("数据元素%d入队成功!\n", i);
        } else {
            printf("数据元素%d入队失败!\n", i);
        }
    }
    printf("入队之后的队列\n");
    traverseSqQueue(&sqQueue);

    printf("\n出队列测试...\n");
    int element;
    for (int i = 1; i <= 3; i++) {
        if (deSqQueue(&sqQueue, &element)) {
            printf("出队成功,出队列元素:%d\n", element);
        } else {
            printf("出队列失败!\n");
        }
    }

    return 0;
}
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我叫柱子哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值