首页 > 编程语言 >学习笔记2——队列(C++版)

学习笔记2——队列(C++版)

时间:2024-08-29 14:50:54浏览次数:11  
标签:head 队列 笔记 assert tail C++ QueueNode 节点

注意了,这里说的队列并不是STL容器库里面的queue

像链表、队列、栈、二叉树其实是一种数据结构,而vector、queue、set等是容器,是不同的概念。

队列的实现可以有很多方式,可以用结构体内储存数组来实现,也可以用结构体内储存结构体来实现,我们这里选择后者。

如何实现一个队列
1.声明一个队列节点结构体
//和链表相同,一个队列包含多个节点,包含这些节点的结构体就是一个队列了
struct QueueNode{
    DataType val;  //创建一个整型的数据,当然也可以创建其他类型的数据
    QueueNode* next;
};
2.声明一个队列结构体
struct Queue{
    QueueNode* head;
    QueueNode* tail;
    int size;
};

这个时候我们已经具备了一个队列的雏形,接下来继续操作,让他成为一个真正的队列。

3.初始化队列
void QueueInit(Queue*q)  //因为初始化的对象是列表,所以传入指向列表的指针
{
    assert(q);  //输入的q不能是空指针
    q->head = NULL;
    q->tail = NULL;
    q->size = 0;
};
4.实现队列的尾插(入队)
void Push(Queue*q, Datatype x)
{
    assert(q);
    QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
    if(newode == NULL)
    {
        perror("malloc failed!");
        exit(0);
    }
    newnode->next = null;
    newnode->val = x;
    if(q->tail == null)  //尾部为空,说明该队列是空队列
    {
        q->tail = newnode;  //创建一个新节点,该节点成为队列的尾部
        q->head = q->tail;
    }
    else
    {
        q->tail->next = newnode;  //创建一个新的节点,原尾部指向新节点
        q->tail = q->tail->next;  //新节点成为新的尾部
    }
    q->size++;
    
}

这样下来,我们的队列就有了尾插功能,接下来加入头删功能。

5.实现队列的头删(出队)
void Pop(Queue* q)
{
	assert(q);
	assert(q->size != 0);

	QueueNode* next = q->head->next;  //创建一个指向头节点的下一位的指针1
	free(q->head);
	q->head = next;  //指针1成为队列新的头
 
	q->size--;
	
}

到此,我们的队列又有了头删功能。

6.获取头元素和尾元素
//首元素
DataType Front(Queue*q)  //DataType是前面队列节点声明的数据类型
{
    assert(q);
    assert(q->head && q->tail);  //不能为空
    return q->head->val;
}

//尾元素
DataType Back(Queue*q)
{
    assert(q);
    assert(q->head && q->tail);  //不能为空
    return q->tail->val;
}

自此,我们就得到了一个队列。

大家如果觉得麻烦,直接学习STL库中的Queue容器的使用就可以了。

标签:head,队列,笔记,assert,tail,C++,QueueNode,节点
From: https://blog.csdn.net/weixin_52133252/article/details/141592692

相关文章

  • PCIe学习笔记(一)-------1.2 PCIe总线简介
    1,PCIe概览PCIe是第三代外围设备总线,英文缩写为PCIe或者PCIExpress。PCIe是点对点,全双工的差分传输信号总线。点对点互连表示链路上的电气负载有限,从而使发送和接收频率可扩展到更高。PCIe目前成熟的版本有GEN1,GEN2,GEN3,GEN4和GEN5,每一代相较上一代传输速率和传输带宽都有了很大幅......
  • C++ 设计模式——桥接模式
    C++设计模式——桥接模式C++设计模式——桥接模式1.主要组成成分2.逐步构建桥接模式步骤1:创建实现接口步骤2:实现具体实现类步骤3:创建抽象类步骤4:实现扩展抽象类步骤5:客户端使用3.桥接模式UML图UML图解析4.桥接模式的优点5.桥接模式的缺点6.桥接模......
  • 【Markdown笔记】设置字体颜色——转载https://blog.csdn.net/u012028275/article/det
     【Markdown笔记】设置字体颜色dadalaohua于2021-04-0517:53:19发布阅读量5.7w 收藏 293点赞数103分类专栏: Markdown笔记 文章标签: markdown latex html版权GitCode开源社区文章已被社区收录加入社区Markdown笔记专......
  • 黑马JavaWeb开发笔记09——ElementUI代码引入教程、Element常用组件使用(Table, Pagina
    文章目录前言ElementUI1.快速入门(代码引入教程)2.组件:Table表格3.组件:Pagination分页4.组件:Dialog对话框5.组件:Form表单总结前言本篇文章是2023年最新黑马JavaWeb开发笔记09:ElementUI代码进入教程、常用组件使用的总结,帮助需要学习Web开发的朋友温故而知新。El......
  • c++数组挑战-字符环
    题目描述:有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串 ABCEFAGADEGKABUVKLM 的首尾连在一起,构成一个环;字符串 MADJKLUVKL 的首尾连在一起,构成一个另一个环; UVKLMA 是这两个环的一个连续公共字符串。时间限制:1 s内存限......
  • C#学习笔记- 随机函数Random()的用法详解
    原文链接:https://www.jb51.net/article/90933.htmRandom.Next()返回非负随机数;Random.Next(Int)返回一个小于所指定最大值的非负随机数Random.Next(Int,Int)返回一个指定范围内的随机数,例如(-100,0)返回负数1、random(number)函数介绍random(number)返回一个0~number-1之间......
  • 结构开发笔记(六):solidworks软件(五):绘制M2x3.0mm螺丝
    前言  绘制36x36方块摄像头模型中的方块摄像头,用到了2个M2x3.0mm螺丝。  本篇描述其详细绘制方法。 绘制螺丝步骤一:绘制螺纹柱  先把螺纹柱体绘制出来,绘制草图    圆直径2mm,高度3.0mm,用螺纹住满足M2x3.0mm。      添加螺纹:    ......
  • 数据结构(C)---双端队列(Deque)
    在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明:信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要决定之前,请咨询相......
  • OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141561865长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…OpenCV开发专栏......
  • 用c/c++做一个扫雷游戏
    “扫雷”想必80 90年代的都不陌生吧,是当代青年人机必备的益智游戏,今天,我们就用c/c++还原它,记得点赞支持一下,老乔谢谢你们~使用演示设备:1.开发环境 visualstudio2022 或 devc++2.演示系统Windows103.演示课目扫雷游戏效果展示(演示图):上代码:#include<stdio......