【数据结构】带你深入栈和队列,轻松实现各种接口功能

这篇具有很好参考价值的文章主要介绍了【数据结构】带你深入栈和队列,轻松实现各种接口功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】带你深入栈和队列,轻松实现各种接口功能,初阶数据结构,数据结构,c语言,c++,开发语言

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,我们继续来学习初阶数据结构的内容,今天我们要讲的是栈与队列内容中队列部分的内容
好了,废话不多说,开始今天的学习吧!

二.队列

1.队列的概念及结构

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

    【数据结构】带你深入栈和队列,轻松实现各种接口功能,初阶数据结构,数据结构,c语言,c++,开发语言

2.队列的实现

  • 队列也可以使用数组和链表的结构实现,实际上使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
  • 因此在下面的讲解中,我们通过链表来实现

队列的基本结构

typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Que;
  • 在队列的实现中与之前最大的不同是我们使用了两个结构体,其中第一个保存链表的存储的元素以及地址,而第二个保存的则是队列的头和尾的指针,这样有什么意义呢?
  • 在队列中,我们常常需要获取队列保存元素的多少,同时我们又需要实现队列的先进先出,也就是尾插进,头插出,这样如果我们没有一个能够指向尾部的指针,每次都需要通过遍历一下我们这个链表队列来找尾,这无疑不利于程序运行,因此我们定义第二个结构体来找尾。

队列的初始化 QueueInit

//初始化队列
void QueueInit(Que* pq)
{
    assert(pq);
    pq->head = pq->tail = NULL;
    pq->size = 0;
}
  • 初始化非常简单啊,无法是指针置空,让队列元素size置0就行,不多解释啦

往队列中插入元素 QueuePush

//把结点插入队列中(尾插)
void QueuePush(Que* pq, QDataType x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));//malloc申请空间
    if (newnode == NULL)//判断申请是否成功
    {
        perror("malloc failed\n");
        exit(-1);
    }
    newnode->data = x;//插入元素
    newnode->next = NULL;
    if (pq->tail == NULL)
    {
        pq->head = pq->tail = newnode;//如果此时队列中没有元素就把头和尾都指向开辟出来的空间
    }
    else
    {
    	//尾插
        pq->tail->next = newnode;
        pq->tail = newnode;
        
    }
    pq->size++;//插入元素成功,有效元素个数加1
}

【数据结构】带你深入栈和队列,轻松实现各种接口功能,初阶数据结构,数据结构,c语言,c++,开发语言

  • 上面这个图很形象的画出了入队和出队的情况,就不像之前详细的每一过程都用逻辑图带大家逐一分析了,大家结合这张图以及代码中的注释我相信非常好理解这个部分。

删除队列中的元素 QueuePop

// 删除队列中某个结点
void QueuePop(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));//判空,如果为空就不需要再删除了
    //如果只有一个结点
    if (pq->head->next == NULL)
    {	//只有一个结点,释放该节点将头尾置空
        free(pq->head);
        pq->head = pq->tail = NULL;
    }
    else
    {	//出队列
        QNode* next = pq->head->next;//保存一下此时要删除结点的下一个结点      
        free(pq->head);//释放掉该结点
        pq->head = next;//头指向删除结点的下一个结点
    }
    pq->size--;//队列中有效元素减1

}

判断队列是否为空 QueueEmpty

//判断队列是否为空
bool QueueEmpty(Que* pq)
{
    assert(pq);
    return pq->tail == NULL;
}
  • 这里利用返回bool的函数来判断我们的尾是否为0,为0说明此时的队列中没有元素,队列为空返回true,如果尾指针不为0说明队列不为空就返回false

获取队列中的队头元素 QueueFront

//获取队列的队头元素
QDataType QueueFront(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    QNode* cur = pq->head;
    return cur->data;
}

  • 队头元素就是头指针指向的结点,返回头指针存储的元素即可

获取队尾的元素 QueueBack

//获取队列的队尾元素
QDataType QueueBack(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->tail->data;
}
  • 这里就体现了我们使用两个结构体的优势,我们通过尾指针就可以直接指向队尾,返回队尾的元素即可

队列的销毁 QueueDestroy

//队列的销毁
void QueueDestroy(Que* pq)
{
    assert(pq);
    QNode* cur = pq->head;//保存头指针
    while (cur)
    {
        QNode* next = cur->next;//保存需要销毁结点的下一个结点,防止释放掉后找不到
        free(cur);
        cur = next;
    }
    pq->head = pq->tail = NULL;//头尾指针全置空
    pq->size = 0;//有效元素置0
}
  • 我们通过遍历队列链表中每一个结点来销毁我们的队列,当head为空时,说明我们链表中的结点已经全部被销毁,队列的销毁完成

计算队列元素的数量

//计算队列的元素的数量
int QueueSize(Que* pq)
{
    return pq->size;
}
  • 我们每次进行入队或者出队时,都会让有效元素size+1或者-1,因此此时需要获取队列元素的数量时,返回size即可。

总结

  • 今天的内容到这里就结束了,栈与队列的最大区别在于栈是后进先出,而队列是先进先出,两者在实现中实际都并没有那么难,如果你想学好这部分内容的话,不妨自己照着上面的内容试试吧!
  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

【数据结构】带你深入栈和队列,轻松实现各种接口功能,初阶数据结构,数据结构,c语言,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-641925.html

到了这里,关于【数据结构】带你深入栈和队列,轻松实现各种接口功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入浅出带你玩转栈与队列——【数据结构】

    W...Y的主页 😊 代码仓库分享 💕 目录 1.栈 1.1栈的概念及结构 1.2栈的结构特征图  ​编辑 1.3栈的实现 1.3.1栈的初始化 1.3.2进栈 1.3.3出栈 1.3.4销毁内存 1.3.5判断栈是否为空 1.3.5栈底元素的读取 1.3.6栈中大小 1.4栈实现所有接口 2.队列 2.1队列的概念 2.2队列的结构   2.3队列的实

    2024年02月11日
    浏览(62)
  • 【数据结构】栈和队列(队列篇)

    上期我们已经学习了数据结构中的栈,这期我们开始学习队列。 目录 1.队列的概念及结构 2.队列的实现 队列结构体定义 常用接口函数 初始化队列 队尾入队列 队头出队列 获取队列头部元素、 获取队列队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 3.循环队

    2024年02月13日
    浏览(42)
  • 栈和队列【数据结构】

    2024年02月16日
    浏览(45)
  • [数据结构】栈和队列

    目录 1.栈 1.1概念 1.2 栈的使用 1.3.栈的模拟实现 2.队列 2.1概念 2.2队列的使用 2.3队列的模拟实现 2.4 循环队列 2.5双端队列   栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素

    2024年02月07日
    浏览(42)
  • 数据结构:栈和队列

    朋友们、伙计们,我们又见面了,本期来给大家解读一下栈和队列方面的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏:数据结构 个 人 主 页 :  stackY、 目录 前言:  1.栈 1.1栈的

    2024年02月06日
    浏览(43)
  • 数据结构【栈和队列】

    一、栈 1.定义:只允许一端进行插入和删除的线性表,结构与手枪的弹夹差不多,可以作为实现递归函数(调用和返回都是后进先出)调用的一种数据结构; 栈顶:允许插入删除的那端; 栈底:固定的,不允许插入或删除; 空栈:不含元素; 2.特点:后进先出; 3.操作:入

    2024年02月15日
    浏览(49)
  • 数据结构 | 栈和队列

    … 📘📖📃本文已收录至:数据结构 | C语言 更多知识尽在此专栏中! 栈(Stack) 又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表。 队列(Queue) 也是一种特殊的线性表,特殊之处在于它只允许在表的前端(Front)进行删除操作,而在表的

    2024年01月23日
    浏览(43)
  • 数据结构---栈和队列

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作

    2024年01月18日
    浏览(41)
  • 数据结构--栈和队列

    栈是一种常见的数据结构,它遵循 后进先出LIFO (Last In First Out)的原则。 进行数据插入和操作的一端称为栈顶,另一端称为栈底 。 压栈 :栈的插入操作被称为压栈/进栈/入栈,入数据在栈顶。 出栈 :栈的删除操作。出数据也在栈顶; 栈可以用 数组 或者是 链表 来实现;

    2024年02月09日
    浏览(41)
  • 数据结构——栈和队列

    目录  一.前言 二.前文回顾 三.栈 3.1 栈的概念及结构 3.2 栈的实现 3.2.1 初始化函数 3.2.2 销毁函数 3.2.3 入栈函数 3.2.4 出栈函数 3.2.5 计算大小函数 3.2.6 空栈函数 3.2.7 获取栈顶函数  3.2.8 小测试 3.3 全部代码 四.栈的练习 4.1 有效的括号 五.队列 5.1队列的概念及结构 5.2 队列的实

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包