C语言实现基本数据结构——队列

目录

队列

队列实现

队列结构

队列主要实现功能

初始化队列

销毁队列

数据入队

数据出队

获取队尾数据

获取队头数据

判断队列是否为空

获取队列元素个数

项目文件


队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

📌

注意队列不同于栈,出队列顺序和入队列顺序必定刚好相反(即满足先进先出)

队列实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低

队列结构

//基本结构
//定义队列的数据节点
typedef struct QueueNode
{
    QDataType data;
    struct QueueNode* next;// 下一个数据节点的位置
}QNode;

//定义管理队列的结构
typedef struct Queue
{
    QNode* phead;// 队列头
    QNode* ptail;// 队列尾,便于找尾结点,省去每次入队都需要遍历队列
    int size;// 队列的数据个数
}Queue;

队列主要实现功能

//初始化队列
void QueueInit(Queue* q);
//销毁队列
void QueueDestroy(Queue* q);
//数据入队
void QueuePush(Queue* q, QDataType x);
//数据出队
void QueuePop(Queue* q);
//获取队尾数据
QDataType QueueRear(Queue* q);
//获取队头数据
QDataType QueueFront(Queue* q);
//判断队列是否为空
bool QueueEmpty(Queue* q);
//获取队列元素个数
int QueueSize(Queue* q);

初始化队列

//初始化队列
void QueueInit(Queue* q)
{
    //判断是否存在队列
    assert(q);

    q->phead = q->ptail = NULL;
    q->size = 0;
}

销毁队列

//销毁队列
void QueueDestroy(Queue* q)
{
    //确保有队列的存在
    assert(q);
    //删除队列的每一个节点
    while (q->phead)
    {
        QNode* next = q->phead->next;
        free(q->phead);
        q->phead = next;
    }
    q->phead = q->ptail = NULL;
    q->size = 0;
}

数据入队

//数据入队
void QueuePush(Queue* q, QDataType x)
{
    //确保存在队列
    assert(q);

    //为数据创建节点
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    assert(newNode);
    newNode->data = x;
    newNode->next = NULL;
    //插入数据
    //队列为空,更新头和尾节点
    //队列不为空,更新尾结点
    //尾插思路
    if (!q->ptail)
    {
        q->phead = q->ptail = newNode;
    }
    else
    {
        q->ptail->next = newNode;
        q->ptail = q->ptail->next;//更新ptail到新的节点
    }

    //注意更新size
    q->size++;
}

数据出队

//数据出队
void QueuePop(Queue* q)
{
    //确保有队列存在
    assert(q);
    //如果队列为空不执行删除
    assert(!QueueEmpty(q));

    //头删思路
    if (q->phead == q->ptail)
    {
        //注意考虑到最后一个指针的ptail需要置空问题,防止野指针
        q->ptail = NULL;
    }
    QNode* next = q->phead->next;
    free(q->phead);
    q->phead = next;

    //注意更新size
    q->size--;
}

获取队尾数据

//获取队尾数据
QDataType QueueRear(Queue* q)
{
    //确保有队列存在
    assert(q);
    //确保队列不为空
    assert(!QueueEmpty(q));

    //返回ptail指向的位置的值
    return q->ptail->data;
}

获取队头数据

//获取队头数据
QDataType QueueFront(Queue* q)
{
    //确保有队列存在
    assert(q);
    //确保队列不为空
    assert(!QueueEmpty(q));

    //返回phead指向的位置的值
    return q->phead->data;
}

判断队列是否为空

//判断队列是否为空
bool QueueEmpty(Queue* q)
{
    //确保有队列的存在
    assert(q);

    return q->phead == NULL && q->ptail == NULL && q->size == 0;
}

获取队列元素个数

//获取队列元素个数
int QueueSize(Queue* q)
{
    //确保有队列的存在
    assert(q);

    return q->size;
}

项目文件

//头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

//定义队列数据类型
typedef int QDataType;

//定义队列的数据节点
typedef struct QueueNode
{
    QDataType data;
    struct QueueNode* next;// 下一个数据节点的位置
}QNode;

//定义管理队列的结构
typedef struct Queue
{
    QNode* phead;// 队列头
    QNode* ptail;// 队列尾,便于找尾结点,省去每次入队都需要遍历队列
    int size;// 队列的数据个数
}Queue;

//初始化队列
void QueueInit(Queue* q);
//销毁队列
void QueueDestroy(Queue* q);
//数据入队
void QueuePush(Queue* q, QDataType x);
//数据出队
void QueuePop(Queue* q);
//获取队尾数据
QDataType QueueRear(Queue* q);
//获取队头数据
QDataType QueueFront(Queue* q);
//判断队列是否为空
bool QueueEmpty(Queue* q);
//获取队列元素个数
int QueueSize(Queue* q);

//实现文件
#define _CRT_SECURE_NO_WARNINGS 1

#include "queue.h"

//初始化队列
void QueueInit(Queue* q)
{
    //判断是否存在队列
    assert(q);

    q->phead = q->ptail = NULL;
    q->size = 0;
}
//销毁队列
void QueueDestroy(Queue* q)
{
    //确保有队列的存在
    assert(q);
    //删除队列的每一个节点
    while (!QueueEmpty(q))
    {
        QNode* next = q->phead->next;
        free(q->phead);
        q->phead = next;
    }
    q->phead = q->ptail = NULL;
    q->size = 0;
}
//数据入队
void QueuePush(Queue* q, QDataType x)
{
    //确保存在队列
    assert(q);

    //为数据创建节点
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    assert(newNode);
    newNode->data = x;
    newNode->next = NULL;
    //插入数据
    //队列为空,更新头和尾节点
    //队列不为空,更新尾结点
    //尾插思路
    if (!q->ptail)
    {
        q->phead = q->ptail = newNode;
    }
    else
    {
        q->ptail->next = newNode;
        q->ptail = q->ptail->next;//更新ptail到新的节点
    }

    //注意更新size
    q->size++;
}
//数据出队
void QueuePop(Queue* q)
{
    //确保有队列存在
    assert(q);
    //如果队列为空不执行删除
    assert(!QueueEmpty(q));

    //头删思路
    if (q->phead == q->ptail)
    {
        //注意考虑到最后一个指针的ptail需要置空问题,防止野指针
        q->ptail = NULL;
    }
    QNode* next = q->phead->next;
    free(q->phead);
    q->phead = next;

    //注意更新size
    q->size--;
}
//获取队尾数据
QDataType QueueRear(Queue* q)
{
    //确保有队列存在
    assert(q);
    //确保队列不为空
    assert(!QueueEmpty(q));

    //返回ptail指向的位置的值
    return q->ptail->data;
}
//获取队头数据
QDataType QueueFront(Queue* q)
{
    //确保有队列存在
    assert(q);
    //确保队列不为空
    assert(!QueueEmpty(q));

    //返回phead指向的位置的值
    return q->phead->data;
}
//判断队列是否为空
bool QueueEmpty(Queue* q)
{
    //确保有队列的存在
    assert(q);

    return q->phead == NULL && q->ptail == NULL && q->size == 0;
}
//获取队列元素个数
int QueueSize(Queue* q)
{
    //确保有队列的存在
    assert(q);

    return q->size;
}

//测试文件
#define _CRT_SECURE_NO_WARNINGS 1

#include "queue.h"

void Test()
{
    Queue q = {0};
    //初始化队列
    QueueInit(&q);
    //数据入队
    QueuePush(&q, 1);
    QueuePush(&q, 2);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    QueuePush(&q, 5);
    //打印数据
    while (!QueueEmpty(&q))
    {
        printf("%d", QueueFront(&q));
        QueuePop(&q);
    }
    //销毁队列
    QueueDestroy(&q);

}

int main()
{
    Test();

    return 0;
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
数据结构是计算机科学中的一个重要概念,它涉及到如何组织和存储数据,以及如何对数据进行操作和处理。C语言是一种常用的编程语言,也是学习数据结构的常用语言之一。下面是一个使用C语言实现数据结构编程例题: 我们考虑一种简单的数据结构——栈。栈是一种先进后出(LIFO)的数据结构,类似于现实生活中的一叠盘子。我们可以通过数组来实现栈的基本功能。 首先,我们需要定义一个结构体来表示栈,该结构体包括一个指向数组的指针,以及一个表示栈顶位置的整数变量。 ```c typedef struct { int* array; int top; } Stack; ``` 接下来,我们可以定义一些栈的基本操作,如初始化、判断栈是否为空、入栈、出栈等。 ```c // 初始化栈 void initStack(Stack* stack, int capacity) { stack->array = (int*)malloc(capacity * sizeof(int)); stack->top = -1; } // 判断栈是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 入栈 void push(Stack* stack, int element) { stack->array[++stack->top] = element; } // 出栈 int pop(Stack* stack) { return stack->array[stack->top--]; } ``` 通过上述代码,我们就可以使用C语言实现一个简单的栈数据结构了。我们可以调用这些函数来进行栈的初始化、判空、入栈、出栈操作。 以上是一个简单的数据结构c语言版编程例题,通过使用C语言实现栈的基本操作,我们可以更好地理解栈的原理和实现。当然,数据结构还包括许多其他类型,如链表、队列、树等,对于每种数据结构,我们都可以使用C语言来进行编程实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怡晗★

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

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

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

打赏作者

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

抵扣说明:

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

余额充值