程序员乐逍遥
15年C/C++开发经验资深程序员、想跟我学编程的可以观看我精心录制的视频课程!
展开
-
一种特殊的二叉树 哈夫曼树(Huffman Tree)
哈夫曼树(Huffman Tree)是一种特殊的二叉树,它在信息编码领域有着广泛的应用,特别是在数据压缩技术中。下面我将通过图文结合的方式,详细介绍哈夫曼树的概念、构建方法以及应用场景。哈夫曼树的概念哈夫曼树是一种特殊的二叉树,由David Huffman于1952年提出。它主要用于解决数据编码问题,通过给定字符的频率来构造一棵二叉树,使得树中所有叶子节点的权重之和最小。哈夫曼树的每个叶子节点代表一个字符,而其非叶子节点则用于连接子树。原创 2024-07-03 13:43:23 · 51 阅读 · 0 评论 -
表达式二叉树的应用
表达式二叉树,顾名思义,是一种用于表示算术或逻辑表达式的二叉树。在这样的树中,叶子节点通常代表操作数(数字或变量),而非叶子节点则代表运算符。这种结构使得表达式的求值和优化变得非常直观和高效。表达式二叉树不仅是一种优雅的数据结构,更是连接数学与计算机科学的桥梁。通过本文的介绍,相信你已经对表达式二叉树有了更深入的理解。无论是从理论角度还是实践应用,掌握表达式二叉树都将为你的编程之旅增添一份独特的魅力。在未来的学习和工作中,不妨尝试将这一数据结构应用于实际问题中,体验它带来的便利与效率吧!原创 2024-07-03 09:58:48 · 38 阅读 · 0 评论 -
25 - 散列表- 散列函数
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,散列表本质上也是一个数组,存放记录的数组叫做散列表。一个好的散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地被定为!原创 2023-07-17 21:36:01 · 307 阅读 · 0 评论 -
24 - 数组和广义表 - 二维数组
类型说明符 数组名[常量表达式][常量表达式]二维数组的列必须指定,并且数组大小一旦定义,则无法更改!原创 2023-07-17 19:07:23 · 141 阅读 · 0 评论 -
23 - 数组和广义表 - 数组
数组(array)是一种线性表的数据结构,用一组连续的内存空间,存储相同的类型数据。当数组每个元素都只带有一个下标时,称这样的数组为一维数组。下面则是定义了相关的一维数组int a[10];//说明整型数组a,有10个元素//说明实型数组b,有10个元素,实型数组a,有20个元素//说明字符数组ch,有20个元素对于数组注意以下几点:1)对于同一个数组,其所有元素的数据类型都是相同的。2)数组名的书写规则应符合标识符的书写规定。3)数组名不能与其他变量名相同。原创 2023-07-17 19:05:42 · 155 阅读 · 0 评论 -
21 - 队列 - 循环队列——队列的顺序表示和实现
队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端称为 队头front。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。我们在实际生活中排队买东西的时候,是不是就是一种队列,遵循先到先购买的特点,如果我们以后的业务场景需要有这种排队机制,则使用队列是非常适合的!原创 2023-07-17 19:02:47 · 295 阅读 · 0 评论 -
20 - 队列 - 链队列——队列的链式表示和实现
队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端称为 队头front。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。使用链式队列,可以动态扩容,不受数组固定容量的限制,所以链式队列要比数组队列要更加灵活!原创 2023-07-17 19:00:27 · 342 阅读 · 0 评论 -
19 - 队列 - 抽象数据类型队列的定义
定义:只能在 表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。逻辑结构:与线性表相同,仍为一对一关系。存储结构:用顺序队列或链队存储均可。运算规则: 先进先出(FIFO)实现方式:关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同。大家可以尝试使用ADT抽象栈的定义!原创 2023-07-17 18:58:38 · 228 阅读 · 0 评论 -
18 - 堆栈 - 二项堆
二项堆具有良好的性质。在 O(log2n)的时间内即可完成两个二项堆合并操作,所以二项堆是可合并堆,而仅仅需要O(1)的时间,二项堆即可完成插入操作 ,基于二项堆实现的优先队列和进程调度算法有着很好的时间性能。原创 2023-07-17 18:57:56 · 110 阅读 · 0 评论 -
17 - 堆栈 - 斐波那契堆
斐波那契堆的重要属性是:它是一组最小堆序树。(即根节点总是比叶小。在最小元素节点处维护一个指针。它由一组标记的节点组成。(减键操作)斐波那契堆中的树是无序的,但有根。原创 2023-07-17 18:55:42 · 139 阅读 · 0 评论 -
16 - 堆栈 - 优先级队列
利用大顶堆的特性,出队列时可以保证是优先级最高的那个元素哦!原创 2023-07-17 18:53:52 · 388 阅读 · 0 评论 -
15 - 堆栈 - 大顶堆
小顶堆的每个结点的值都大于或等于其左右孩子结点的值、用数组存放时满足arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 公式哦!原创 2023-07-17 18:52:20 · 242 阅读 · 0 评论 -
14 - 堆栈 - 小顶堆
小顶堆的每个结点的值都小于或等于其左右孩子结点的值、用数组存放时满足 arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 公式哦!原创 2023-07-17 18:50:27 · 303 阅读 · 0 评论 -
13 - 堆栈 - 堆栈的链表实现
/定义栈//指向栈顶//定义单向链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//定义栈//指向栈顶//创建链表头//入栈//创建动态内存链表,指针变量//链表初始化//加入一个节点//始终指向栈顶//出栈printf("栈是空的!\n");return -1;//打印节点printf("从栈顶到栈底:\n");while (p)int main()//入栈。原创 2023-07-17 18:48:38 · 129 阅读 · 0 评论 -
12 - 堆栈 - 数组实现堆栈
我们对栈的操作,实际上就是对数组的操作,由于栈只允许在栈顶进行出栈,所以使用数组的效率非常高,非常适合使用数组来实现!原创 2023-07-17 18:46:46 · 107 阅读 · 0 评论 -
11 - 堆栈 - 堆栈
在计算机系统中, 堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。堆这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。这节课我们主要了解一些概念,我们会发现,在计算机系统中,就应用了数据结构的栈,来进行函数调用、中断切换时保存和恢复现场数据,包括在汇编指令中也提供对栈的操作,相信大家学完栈对操作系统的理解也会更加深入。原创 2023-07-17 18:45:01 · 139 阅读 · 0 评论 -
10 - 线性表的类型定义 - 队列
队列(Queue)也是一种线性表,但是它仅能在一端进行插入,而另一端进行删除的操作,插入的一端称为队尾(rear),删除的一端称为队头(front )。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。内存结构如下图://定义队列int front;// 队头删除int rear;// 队尾插入从上面我们可以看出,队列的实现采用的是数组,同时需要设置两个变量 front 与 rear 分别记录队列前后端的下标,front。原创 2023-07-17 18:43:47 · 50 阅读 · 0 评论 -
09 - 线性表的类型定义 - 栈
栈(Stack)也是一种线性表,但是它仅能在一端进行插入和删除的操作,这一端被称为栈顶, 另一端则称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其下一个元素成为新的栈顶。如下图栈的内存结构。//定义栈int top;//指向栈顶从上面我们可以看出,顺序栈的实现采用的是数组。//定义栈int top;//指向栈顶//初始化栈//入栈else。原创 2023-07-17 18:41:38 · 170 阅读 · 0 评论 -
08 - 线性表的类型定义 - 循环双向链表
循环双向链表就是在双向链表的基础之上,头结点的Prev指向尾结点,尾结点的Next指针则指向头结点,从而形成闭环结构。//定义双向链表的节点//指向上一个节点的指针//指向下一个节点的指针//定义双向链表的节点//指向上一个节点的指针//指向下一个节点的指针//创建结点,链表,参数数字域//创建动态内存链表,指针变量//链表初始化//链表初始化//创建链表头//前置指向自己//后置也指向自己//头插法= NULL)else。原创 2023-07-17 18:38:04 · 168 阅读 · 0 评论 -
07 - 线性表的类型定义 - 循环单向链表
循环单向链表就是在普通单向链表的基础上尾节点的指针指向头节点,从而形成闭环结构。//数据成员//指向下一个节点的指针//定义单向循环链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//创建某个节点//创建动态内存链表,指针变量//链表初始化//创建链表头//next指向自己//头插法,插入一个节点= NULL)elseprintf("节点不存在\n");//修改节点,参数链表,修改的第n个节点printf("链表为空!\n");原创 2023-07-17 18:34:10 · 53 阅读 · 0 评论 -
06 - 线性表的类型定义 - 双链表
数据域和指针域,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,对单向的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。对于双向链表来说,它的每个节点要指向“直接前驱”和“直接后继”,所以节点类需要含有两个指针域。指向直接前驱的指针使用pre表示,指向后继的指针使用next表示。双向链表是在单向链表基础上的一个改进,每个节点指向其直接前驱和直接后继节点。因此,从双向链表的任意位置开始,都能访问所有的节点。//数据成员。原创 2023-03-21 13:17:19 · 111 阅读 · 0 评论 -
05 - 线性表的类型定义 - 链表
链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。//数据成员//一定不能缺的成员//指向下一个节点的指针,可以通过它,知道下个节点的地址//定义单向链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//创建某个节点//创建动态内存链表,指针变量//链表初始化//创建链表头//头插法,插入一个节点= NULL)elseprintf("节点不存在\n");原创 2023-03-21 13:15:16 · 217 阅读 · 0 评论 -
04 - 线性表的类型定义 - 数组
线性表是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数组(array)是一种线性表的数据结构,用一组连续的内存空间,存储相同的类型数据。//元素集合int size;//元素个数//容量}SeqList;//元素集合int size;//元素个数//容量}SeqList;//初始化表//初始容量\n");//添加一个元素{ // 判断表中元素是否已满\n");return;// 添加元素e。原创 2023-03-21 11:27:45 · 118 阅读 · 0 评论 -
03- 算法和算法分析 - 算法的存储空间需求
算法对空间的需求是可以进行优化的、我们需要权衡算法与空间的平衡性,以时间换空间,或者以空间换时间,都需要在具体算法场景中来综合考虑。原创 2023-03-21 11:25:40 · 653 阅读 · 0 评论 -
02- 算法和算法分析 - 算法效率的度量
对于一个算法, 时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间 ,以“用空间换时间”;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。原创 2023-03-21 13:15:32 · 439 阅读 · 0 评论 -
01- 算法和算法分析 - 算法设计的要求
很高兴大家能够阅读本套课程内容,从本节开始我们将系统性的学习数据结构相关的知识。当然,数据结构和算法是密切相关,本单元我们就来聊一聊算法和算法分析的问题。本节我们先说算法的设计的要求。原创 2023-03-21 11:25:35 · 262 阅读 · 0 评论 -
C++循环输出M * N 的螺旋矩阵
什么是螺旋矩阵?螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。 如图11 * 7的螺旋矩阵 如图11 * 11的螺旋矩阵 话不多说,上代码:#include <iostream>#include <iomanip>using namespace ...原创 2018-08-23 11:52:10 · 7871 阅读 · 5 评论 -
C++内存池讲解
很多学员对内存池特别陌生,在这里跟大家探讨下网上的一片技术文:https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.htmlclass MemoryPool{public: MemoryPool (int _nUnitSize, int _nGrowSize = 3原创 2017-11-14 16:14:02 · 421 阅读 · 0 评论 -
映射表类(CMap)
映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”。CMap是把唯一关键码映射到值的字典收集类,使用CMap可以构造一个关键字和元素值映射的集合类。一旦在映射中插入了一个关键码值对(元素),就可以使用这些关键码,有效地获取或者删除对元素。同样,也可以反复使用映射中的所有元素。 就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射转载 2017-10-05 15:03:49 · 4488 阅读 · 0 评论 -
链表(单向、双向、单向循环、双向循环)学习过程总结——有源代码、注释和示意图
前段时间学习了数据结构的部分知识,然后到上个星期别人问相关问题的饿时候发现自己对链表的知识都有些模糊了,主要还是有些细节的地方记不太清楚,所以就萌生了写这篇博客的想法,一是要重新复习一下链表的相关知识,二呢用C++重新写一遍,熟悉C++语言。之前用C语言实现链表操作的时候也写过几篇博客,但是重点都是体现在代码部分,示意图都是从网站上下过来的或是别人博客上摘过来的,这次自己用Processon在网页转载 2017-07-11 23:41:35 · 1356 阅读 · 0 评论