数据结构——队的基本操作

news2024/9/23 11:25:26

一、顺序队

队的用法:先进先出

跟平时我们遇到的大多情况一样,队的主要思想就是先进先出,比如我去食堂打饭,我先排那么就是我先打到饭咯

顺序队:其实说白了就是一块空间用两个指针去指向,为了实现先进先出的功能

需要注意:这里的两个指针指向,每次入队,队尾指针++,每次出队,队头指针也是++

而且入队要考虑从无到有的情况,出队要考虑从有到无的情况

1、定义

队的定义

//数据类型的定义

typedef int ElemType;

//顺序栈的定义

typedef struct Circlequeue

{

    ElemType data[MAX_LEN];//直接定义一个数组

    int front;//队首的下标

    int rear;//队尾下标

    int num;//队中元素的个数

}CQ;

需要注意的是这里的front rear num都是整型,不是指针 ,后面画图的时候,将front和rear用一条直线连向空间,不是指向哦,不是指针,只是为了表示下标的位置

2、初始化

首先创建一个空队列,使它存在

/*

    函数名:InitQueue

    参数列表:无

    返回值:创建空队的地址

*/

CQ* InitQueue()

{

    //创建一个队列,并且初始化

    CQ* cq=(CQ*)malloc(sizeof(CQ));

    cq->front=-1;

    cq->rear=-1;

    cq->num=0;

    //返回队列的地址

    return cq;

}

3、入队 

将一个数值入队,例如:EnQueue(cq,1)

/*

    函数名:EnQueue

    参数列表:需要入队的队的地址@cq 要入队的元素d

    返回值:成功入队返回1,失败返回0

*/

int EnQueue(CQ* cq,ElemType d)

{

    //如果不能入队的情况

    if(cq==NULL||cq->num==MAX_LEN)

    {

        return 0;

    }

    //入队

    if(cq->num==0)

    {

        cq->front=(cq->front+1)%MAX_LEN;

        cq->rear=(cq->rear+1)%MAX_LEN;

        //只能从队尾入队

        cq->data[cq->rear]=d;

    }

    else

    {

        cq->rear=(cq->rear+1)%MAX_LEN;

        ca->data[ca->rear]=d;

    }

    cq->num++;

    return 1;

}

4、出队 

将一个数值出队到某一特定的空间中去(d),例如:DeQueue(cq,&d)

/*

    函数名:DeQueue

    参数列表:要出队的队列@cq,出队的数据存放地址

    返回值:成功返回1,失败返回0

*/

CQ* DeQueue(CQ* cq,ElemType* d)

{

    if(cq==NULL||cq->num==0)

    {

        return 0;

    }

    *d=cq->data[ca->front];

    cq->num--;

    if(cq->num==0)

    {

        //假如出队出完了:队头和队尾都要重新改变

        cq->front=(cq->front+1)%MAX_LEN;

        cq->rear=(cq->rear+1)%MAX_LEN;

    }

    {

        //只能从队头出队

        cq->front=(cq->front+1)%MAX_LEN;

    }

    return 1;

}

5、求队列长度

/*

    函数名:Queuelength

    参数列表:传进去一个队列的地址@cq

    返回值:返回队列的长度

*/

int Queuelength(CQ* cq)

{

    if(cq==NULL||cq->num==0)

    {

        return 0;

    }

    return cq->num;

}

6、获取队头数据

/*

    函数名:Gethead

    参数列表:传进去一个队的地址@cq,还有一个存放队头数据的空间地址@&d

    返回值:成功获取返回1,失败返回0

*/

ElemType Gethead(CQ* cq,ElemType* d)

{

    if(cq==NULL||cq->num==0)

    {

        return 0;

    }

    *d=cq->data[ca->front];

    return 1;

}

7、判断一个队列是否为空

/*

    函数名:Ifempty

    参数列表:传进去一个队的地址@cq

    返回值:空返回1,非空返回0

*/

int Ifempty(CQ* cq)

{

    if(cq==NULL||cq->num==0)

    {

        return 1;

    }

    return 0;

}

8、清空一个队

/*

    函数名:Clearqueue

    参数列表:传进去一个队列的地址@cq

    返回值:无

*/

void Cleadqueue(CQ* cq)

{

    if(cq)

    {

        cq->front=-1;

        cq->rear=-1;

        cq->num=0;

    }

}

9、销毁一个顺序队 

先清空,使其初始化,再释放申请的队的空间

/*

    函数名:Destroyqueue

    参数列表:传进去一个队列的地址@cq

    返回值:无

*/

void Destroyqueue(CQ* cq)

{

    //定义的时候可以互相调用

    Cleadqueue(cq);

    free(cq);

}

10、打印一个顺序队

/*

    函数名:Print_cqueue

    参数列表:传进去一个队@cq

    返回值:成功打印返回1 失败返回0

*/

int Print_cqueue(CQ* cq)

{

    if(cq==NULL||cq->num==0)

    {

        return 0;

    }

    ElemType d;

    printf("现在顺序队开始出队,出队方式是从链头一一出:");

    while(!Ifcqempty(cq))

    {

        //每出队一次,打印一次

        Decqueue(cq,&d);

        printf("%d ",d);

    }

    printf("\n");

    return 0;

}

 

11、帮助理解图 

二、链式队

每输入一个数据,开辟一块空间并入队,灵活存取

每出队一个数据,先保存要出队的数据,再将曾经为了保存这个数据开辟的空间释放掉,而且不能影响现有队列的结构和操作

1、链式队的定义

队中每个数据的功能先设置单一点,只能指向下一个数据,既不能双向,也不能循环

队中存放数据的数据结点的定义

typedef struct node

{

    ElemType data;

    struct node* next;

}

“头结点”——队的定义 

typedef struct Linkqueue

{

    Node* front;

    Node* rear;

    int num;

}LQ;

2、链式栈的初始化

 /*

    函数名:Initqueue

    参数列表:无

    返回值:返回创建好的链式队的地址

*/

LQ* Initqueue()

{

    LQ* lq=(LQ*)malloc(sizeof(LQ));

    lq->front=NULL;

    lq->rear=NULL;

    lq->num=0;

    return lq;

}

3、入队 

/*

    函数名:Enqueue

    参数列表:要入队的队列lq数值d

    返回值:成功入队返回1,失败返回0

*/

int Enqueue(LQ* lq,ElemType d)

{

    Node* pnew=(Node*)malloc(sizeof(Node));

    pnew->data=d;

    pnew->next=NULL;

    if(lq==NULL)

    {

        return 0;

    }

    if(lq->num==0)

    {

        lq->front=pnew;

        lq->rear=pnew;

    }

    else

    {

        lq->rear->next=pnew;

        lq->rear=pnew;

    }

    lq->num++;

}

4、出队

/*

    函数名:Dequeue

    参数列表:出队的队列和数据lq存放的空间d

    返回值:成功出队返回1 失败返回0

*/

int Dequeue(LQ* lq,ElemType* d)

{

    if(lq==NULL||lq->num==0)

    {

        return 0;

    }

    //遍历删除指针

    Node* px=lq->front;

    *d=lq->front->data;

    if(px->next==NULL)

    {

        //只有一个结点的时候

        lq->front=NULL;

        lq->next=NULL;

    }

    else

    {

        lq->front=lq->front->next;

        px->next=NULL;

    }

    free(px;)

    l->num--;

    return 1;

}

 5、求队列长度

/*

    函数名:Queuelength

    参数列表:指向队列的指针

    返回值:队列长度

*/

int Queuelength(LQ* lq)

{

    if(lq==NULL)

    {

        return 0;

    }

    return lq->num;

}

6、获取队头元素

/*

    函数名:Gethead

    参数列表:队列的地址指针lq和队首元素存放的空间d

    返回值:成功返回1  失败返回0

*/

ElemType Gethead(LQ* lq,ElemType* d)

{

    if(lq==NULL||lq->num==0)

    {

        return 0;

    }

    *d=lq->front->data;

    return 1;

}

7、判断队列是否为空

/*

    函数名:Ifempty

    参数列表:传进去一个指向队列的地址lq

    返回值:空返回1  非空返回0

*/

int Ifempty(LQ* lq)

{

    if(lq==NULL||lq->num==0)

    {

        return 1;

    }

    return 0;

}

 8、清空队列

/*

    函数名:Clearqueue

    参数列表:传进去指向队列的地址lq

    返回值:无

*/

void Cleadqueue(LQ* lq)

{

    if(lq==NULL)

    {

        return ;

    }

    //遍历清除指针

    Node* px=lq->front;

    while(px)

    {

        lq->front=lq->front->next;

        px->next=NULL;

        free(px);

        lq->num--;

        px=lq->front;

    }

    lq->rear=NULL;

    lq->num=0;

    return ;

}

9、销毁队列

/*

    函数名:Destroyqueue

    参数列表:传进去指向队列的地址lq

    返回值:无

*/

void Destroyqueue(LQ* lq)

{

    if(lq==NULL)

    {

        return ;

    }

    //遍历清除指针

    Node* px=lq->front;

    while(px)

    {

        lq->front=lq->front->next;

        px->next=NULL;

        free(px);

        lq->num--;

        px=lq->front;

    }

    lq->rear=NULL;

    lq->num=0;

    free(lq);

}

10、打印一个链式队

/*

    函数名:Print_lqueue

    参数列表:传进去一个队@lq

    返回值:成功打印返回1 失败返回0

*/

int Print_lqueue(LQ* lq)

{

    if(lq==NULL||lq->num==0)

    {

        return 0;

    }

    ElemType d;

    printf("现在链式栈开始出队,出队方式是从链头一一出:");

    while(!Iflqempty(lq))

    {

        Delqueue(lq,&d);

        printf("%d ",d);

    }

    printf("\n");

    return 0;

}

 11、帮助理解图

三、主函数代码实现及运行结果演示 

#include <stdio.h>

#include <stdlib.h>

#include "Treelian.h"

int main()

{

    //顺序队实现:我设置了队里面最大存放个数是10

    printf("现在开始验证顺序队,开辟int数据空间个数是10!\n");

    CQ* cq=Initcqueue();

    printf("从队尾入队:现在将2、4、6、8、10入队!\n");

    //入队方式1

    Encqueue(cq,2);

    Encqueue(cq,4);

    Encqueue(cq,6);

    Encqueue(cq,8);

    Encqueue(cq,10);

    //入队方式2

    // int d1;

    // while(1)

    // {

    //     scanf("%d",&d1);

    //     if(d1==0)

    //     {

    //         break;

    //     }

    //     Encqueue(cq,d1);

    // }

    Print_cqueue(cq);

    printf("-------------------------------------------------------------------------------\n");

    //链式队实现:输入一个数开辟一块空间 出队一个数释放一块空间

    printf("现在开始验证链式队\n");

    LQ* lq=Initlqueue();

    int d2;

    printf("请输入你要入队的数据(这里数据个数不做限制),规定直到输入0表示结束:\n");

    while(1)

    {

        scanf("%d",&d2);

        if(d2==0)

        {

            break;

        }

        Enlqueue(lq,d2);

    }

    //出队

    Print_lqueue(lq);

    return 0;

}

 这个是gcc编译器调试结果示意图


以上是我对数据结构中栈内容的学习记录, 其中有说法不准确的地方欢迎各位朋友指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何获取页面的MP3文件

1、使用Google浏览器&#xff0c; 2、F12打开网页编程模式 3、找到network选项卡&#xff0c; 4、然后点击播放按钮&#xff0c;此时network中会加载各类资源&#xff1b; 5、在type中找到’media‘&#xff0c;点击media的名称&#xff1b; 6、找到request url&#xff1…

【AI绘画教程】StableDiffusion新手教程|5分钟搞定平面线稿转3D效果,100%成功(附教程工具)

大家好&#xff0c;我是画画的小强 曾经&#xff0c;我们对于将线稿转化为精美上色作品只能望而却步&#xff0c;然而如今&#xff0c;有了稳定扩散人工智能AI绘画工具&#xff08;SD&#xff09;&#xff0c;我们可以以更加神奇的方式为线稿赋予绚丽的色彩&#xff0c;将创意…

Powershell@2 文件操作整理

最近又开始折腾pipeline了&#xff0c;对文件操作&#xff0c;这里实践并记录一下 https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/get-content?viewpowershell-7.4 列出文件及文件夹 Get-ChildItem Get-ChildItem -Path D:\1_data…

神经内科经颅磁刺激(TMS)疗法介绍

经颅磁刺激&#xff08;TMS&#xff09;作为一种先进的非侵入性、无痛的治疗手段&#xff0c;其核心基于电磁学原理。该技术通过储能电容向特制线圈瞬间释放强大电流&#xff0c;生成穿透颅骨的强磁场。这一磁场在大脑内部诱导产生微弱的感应电流&#xff0c;触发一系列复杂的生…

Pascal编程语言

目录 一、Pascal语言的诞生与特点 二、Pascal编程环境的选择与安装 三、Pascal语法基础与实战 pascal复制代码 pascal复制代码 在计算机编程的丰富世界中&#xff0c;Pascal语言以其严谨的结构和强大的功能而独树一帜。对于初学者来说&#xff0c;Pascal编程语言不仅可以帮…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels3, out_channels 64, kernel_size3, stride1, padding0, biasFalse) in_channels in_channels 可以设置成1&#xff0c;2&#xff0c;3&#xff0c;4等等都可以&#xff0c;一般来说做图像识别的时…

大模型就业行情揭秘:哪些岗位最吃香?

随着人工智能技术的发展&#xff0c;尤其是大模型技术的成熟与广泛应用&#xff0c;相关行业的人才需求量也呈现出爆发式增长。对于想要进入这个领域的求职者来说&#xff0c;了解当前大模型就业岗位的行情显得尤为重要。本文将深入剖析目前大模型就业岗位的市场情况&#xff0…

本地生活本地推软件有哪些?手把手教你从零开始提升转化率!

当前&#xff0c;多家互联网大厂在本地生活版块的布局不断深入&#xff0c;让本地生活市场不断焕发新活力的同时&#xff0c;也使得竞争态势日益激烈。在此背景下&#xff0c;对于本地生活服务商而言&#xff0c;无论是想要拓展品牌商家资源&#xff0c;还是想要改善交付效果&a…

广东超高清视频产业高质量发展成果展在粤开展

8月27日&#xff0c;广东超高清视频产业高质量发展成果展于中国&#xff08;广州&#xff09;超高清视频创新产业园区广州国际媒体港举行。本次展会聚焦广东超高清视频产业&#xff0c;展示以新技术赋能广电新质生产力&#xff0c;推动广播影视和网络视听高质量发展的最新成果&…

[Arxiv 2024] Self-Rewarding Language Models

Contents IntroductionMethodExperimentsReferences Introduction 作者提出 Self-Rewarding 训练框架&#xff0c;LLM 在训练过程中同时担任 actor 和 critic&#xff0c;actor 负责合成新数据&#xff0c;critic 负责判断合成数据质量用于组成高质量的偏好数据集用于模型的下…

网络排名变差算法在充电桩计量可信度评价中的应用AcrelCloud-9000安科瑞充电柱收费运营云平台

摘要&#xff1a;网络排名变差算法是指根据充电交易流水数据构造桩车网络&#xff0c;利用复杂网络的投票智慧而非传统的物理实验来获得对量值的信心。将排名变差算法用于桩车网络计算中&#xff0c;旨在检定合格的充电桩对其他充电桩排名变化的影响&#xff0c;这种影响以电动…

若依添加字段权限功能

页面长这样 /*Navicat Premium Data TransferSource Server : 本地Source Server Type : MySQLSource Server Version : 80038Source Host : 127.0.0.1:3306Source Schema : healthTarget Server Type : MySQLTarget Server Version : 80038Fi…

干货满满!五大调光方式让你全面了解LED照明

LED的发光原理同传统照明不同&#xff0c;是靠P&#xff0d;N结发光&#xff0c;同功率的LED光源&#xff0c;因其采用的芯片不同&#xff0c;电流电压参数则不同&#xff0c;故其内部布线结构和电路分布也不同&#xff0c;导致了各生产厂商的光源对调光驱动的要求也不尽相同&a…

PHP付费心理测评小程序源码心理测试抑郁症性格测试H5变现系统源码

揭秘付费心理测试新宠&#xff1a;郁郁症性格测试小程序&#xff0c;如何变现又贴心&#xff1f; &#x1f308; 引言&#xff1a;心理健康的数字化探索 在这个快节奏、高压力的时代&#xff0c;越来越多的人开始关注自己的心理健康。付费心理测试&#xff0c;尤其是针对郁郁…

【JAVA入门】Day26 - Lambda表达式

【JAVA入门】Day26 - Lambda表达式 文章目录 【JAVA入门】Day26 - Lambda表达式一、函数式编程二、Lambda表达式的省略写法 Lambda表达式在代码中最常用的功能就是简化匿名内部类的书写。 Ingeger[] arr {2, 3, 1, 5, 6, 7, 8, 4, 9};Arrays.sort(arr, new Comparator<Int…

【深度学习与NLP】——深度卷积神经网络AlexNet

目录 一、卷积神经网络的发展历程 二、简要介绍 三、代码实现 四、缺点和过时的地方 一、卷积神经网络的发展历程 早期理论基础阶段&#xff08;20 世纪 60 年代 - 80 年代&#xff09;&#xff1a; 1968 年&#xff0c;Hubel 和 Wiesel 通过对猫视觉神经的研究&#xff0…

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型&#xff0c;快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程&#xff0c;将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的…

C++笔记12•面向对象之继承•

继承 1.继承的概念及定义 &#xff08;1&#xff09;概念&#xff1a; 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称…

【Linux】进程|进程的查看与管理|创建进程

目录 1️⃣ 进程的概念&#xff08;Process&#xff09; 1.什么是进程&#xff1f; 2.多进程管理 3. 描述进程-PCB 2️⃣ 进程的查看与管理 1.使用指令查看进程 2.通过系统调用函数查看pid 3.杀掉进程 4.ppid&#xff08;父进程id&#xff09; 3️⃣ 创建进程 fork(…

大模型面试:LLM+向量库的文档对话系统

面试题 1.1 为什么大模型需要外挂(向量)知识库&#xff1f;如何将外部知识注入大模型&#xff0c;最直接的方法&#xff1a;利用外部知识对大模型进行微调 回答 大模型需要外挂(向量)知识库的原因&#xff1a; 知识更新频率&#xff1a;大模型在训练时使用的知识是静态的&a…