数据结构实战开发
独行Freedom
这个作者很懒,什么都没留下…
展开
-
数据结构实战开发中类继承关系图
总结一下数据实战开发教程里的类继承关系图: 备注:本数据结构实战开发系列的学习资料来自狄泰软件学院的《数据结构实战开发教程》,有兴趣的同学可以加入qq群,群号是199546072...原创 2018-03-15 16:24:47 · 824 阅读 · 0 评论 -
泛型编程简介
1、数据结构课程的特点: — 专注于数据元素之间的关系 — 专注于特定结构之上的算法 — 数据结构课程并不关注数据元素的具体类型如何为数据结构的学习选择合适的语言? 唐老师经验:支持泛型编程的语言是最适合数据结构课程的学习。2、泛型编程的概念:不考虑具体数据类型的编程方式。 — C++中的函数模板 (1)一种特殊的函数可用于不同类型进行调用 (2)看起来和普通函数很相似,区别...原创 2018-03-14 10:16:11 · 250 阅读 · 0 评论 -
智能指针示例
1、智能指针:使用C++模板技术实现的一个类 2、内存泄漏 (1)动态申请堆空间,用完后不归还 (2)C++语言中没有垃圾回收的机制 (3)指针无法控制所指堆空间的生命周期(本质的问题):指针也是一种变量,既然是变量就有生命周期,一个局部的指针指向堆空间之后,当局部指针声明周期结束了,这片堆空间的生命周期并没结束,指针指向的堆空间无人接管,发生内存泄漏。 3、智能指针 (1)指针生命周...原创 2018-03-14 10:21:09 · 335 阅读 · 0 评论 -
异常类构建
构建异常类的原因:因为当代的C++库基本上都会使用C++中的异常特性,依赖于异常创建出来的库稳定性非常好。 思路:C++中异常的类型可以是自定义类类型。异常类的头文件:#ifndef _EXCEPTION_H_#define _EXCEPTION_H_#include "Object.h"namespace DTLib{#define THROW_EXCEPTION(e,...原创 2018-03-14 10:26:08 · 277 阅读 · 0 评论 -
智能指针SmartPointer和SharedPointer实现
之前已经实现了一个智能指针类,为什么还要再论智能指针呢? 之前设计的SmartPointer的设计方案: (1)指针生命周期结束时主动释放堆空间; (2)一片堆空间最多只能由一个指针标识; (3)杜绝指针运算和指针比较。思考: 如何实现 SharedPointer 使得多个智能指针对象可以指向同一片堆内存 , 同时支持堆内存的自动释放? 设计思路: Pointer继承自Obj...原创 2018-03-20 21:32:46 · 789 阅读 · 0 评论 -
线性表抽象类和顺序存储线性表抽象类实现
在数据结构实战开发中类继承关系图中总体概括了数据结构实战开发中所有类的继承关系,本文分析线性表中顺序表的实现,下一篇实现包括静态顺序表StaticList和动态顺序表DynamicList。 线性表的顺序存储结构顺序存储的定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表中的数据元素。 List实现既然是线性表,那么首先需要线性表抽象类List,主要是...原创 2018-03-20 23:00:39 · 752 阅读 · 0 评论 -
如何将通用树转换为二叉树
通用树采用的是双亲孩子表示法: (1)每个结点都有一个指向其双亲的指针; (2)每个结点都若干个指向其孩子的指针。 如何将这棵树转化为二叉树呢?可采用孩子兄弟表示法: (1)每个结点都有一个指向其第一个孩子的指针; (2)每个结点都有一个指向其第一个右兄弟的指针;步骤: (1)将树的根节点直接作为二叉树的根节点。 (2)将树的根节点的第一个子节点作为二叉树根节点的左指针,若该...原创 2018-03-25 14:54:53 · 2369 阅读 · 0 评论 -
静态顺序表StaticList和动态顺序表DynamicList的实现
上一篇文章实现了List和SeqList,本篇分析两个子类StaticList和DynamicList是怎么实现的。 StaticList实现StaticList要点: 1、使用原生数组作为顺序存储空间; 2、使用模板参数决定数组大小; 代码:#ifndef _STATICLIST_H_#define _STATICLIST_H_#include "SeqList.h...原创 2018-03-21 21:53:31 · 396 阅读 · 0 评论 -
单链表LinkList的实现
上两篇文章分析了顺序表的实现方法,顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!那么怎样解决这个问题呢?这就是接下来要讲的线性表的链式存储结构,也就是我们熟知的链表。 同一系列的还有下面的文章: (1)静态单链表StaticLinkList的实现 (2)循环链表 CircleList的实现并解决约瑟夫环问题 (3)双向链表DualLinkList的实现 像顺序表一...原创 2018-03-21 22:24:57 · 1488 阅读 · 0 评论 -
静态单链表StaticLinkList的实现
单链表LinkList具有缺陷,在长时间使用单链表对象频繁增加和删除数据元素的时候,容易使得堆空间产生大量的内存碎片导致系统运行变慢。 设计静态单链表的思路是:在单链表内部增加一片预留的空间,所有的Node对象都在这片空间中动态创建和动态销毁。 1、通过模板定义静态单链表类(StaticLinkList); 2、在类中定义固定大小的空间(unsigned char[]); 3、重写...原创 2018-03-21 22:28:10 · 474 阅读 · 0 评论 -
课程学习小问答
1、数据结构课程该如何学习?(理解 + 实战) (1)先从概念上形象地理解数据元素之间的关系 (2)思考这种关系能够解决什么问题(如:由数组想到数学里的数列) (3)考虑基于这种关系能够产生哪些算法 (4)理解和熟悉最终的算法 (5)选择一种熟悉的语言,编码实战 2、数据结构的重要性 训练编程思维!!! 数据结构是计算机领域的基础课程,在学习过程中养成的思维方式将影响整个职业生涯。...原创 2018-03-14 10:15:28 · 247 阅读 · 0 评论 -
算法效率的度量
常见时间复杂度: 当算法的时间复杂度为: 即使n的值很小,实际的程序运行时间也是不可接受的!大O的n的3次方是工程开发时时间复杂度的临界点。 当算法在最坏情况下仍能满足需求时,可以推断算法的最好情况和平均情况都满足需求。 空间复杂度 推导时间复杂度的方法同样适用于空间复杂度。空间与时间的策略: — 多数情况下,算法的时间复杂度更令人关注(因为硬件的发展速度比软件的发展速度要...原创 2018-03-14 10:14:45 · 545 阅读 · 0 评论 -
链式队列LinkQueue的实现
和StaticStack类似,当数据元素为类类型,StaticQueue 的对象在创建时,会多次调用元素类型的构造函数,影响效率。需要实现链式队列。队列的链式存储实现设计要点(1)类模板,抽象父类Queue的直接子类; (2)在内部使用链式结构实现元素的存储; (3) 只在链表的头部和尾部进行操作。LinkQueue实现方式一(使用单链表LinkList)代...原创 2018-03-23 20:36:58 · 1872 阅读 · 0 评论 -
双向链表DualLinkList的实现
单链表的缺陷在前文中实现了单链表LinkList(点击这里),但是单链表存在一定的缺陷:只能从头结点开始高效访问链表中的数据元素(单向性);如果需要逆向访问单链表中的数据元素将极其低效;数据插如操作和取数据元素操作时间复杂度不一样。 双向链表因此需要设计一种新的线性表,设计思路: 在“单链表”的结点中增加一个指针pre,用于指向当前结点的前驱结点。 特点: ...原创 2018-03-22 14:27:11 · 602 阅读 · 0 评论 -
双向循环链表DualCircleList的实现(利用Linux内核链表)
目标 使用Linux内核链表实现双向循环链表DualCircleList。设计思路 数据结点之间在逻辑上构成双向循环链表,头结点仅用于结点的定位。 实现思路(1)通过模板定义 DualCirclelist 类,继承自 DualLinkList类; (2)在 DualCircleList 内部使用 Linux 内核链表进行实现; (3)使用 struct lis...原创 2018-03-22 15:01:59 · 246 阅读 · 0 评论 -
基于顺序存储结构的栈StaticStack的实现
关于栈和队列,准备写5篇文章。其中栈的部分包括基于顺序存储结构的栈和链式栈两种,分别是StaticStack和LinkStack。同样队列也有两种,基于顺序存储结构的队列和链式队列,分别是StaticQueue和LinkQueue。最后一篇文章分析栈实现队列和队列实现栈。 本篇先分析怎样实现StaticStack。栈栈是一种特殊的线性表,栈仅能在线性表的一端进行操作,特点是先进后...原创 2018-03-23 10:35:30 · 294 阅读 · 0 评论 -
链式栈LinkStack的实现
上一篇是讲解StaticStack的实现,但是有一个的问题: 由于顺序栈内部实现是采用原生数组来实现的,当存储的元素为类类型时,StaticStack 的对象在创建时,会多次调用元素类型的构造函数,这样就会影响效率。这时候就需要设计链式栈。链式栈的设计 (1)类模板, 抽象父类 Stack 的直接子类; (2)在内部组合使用 Linklist 类 ,实现栈的链式存储; (3...原创 2018-03-23 16:43:02 · 2439 阅读 · 0 评论 -
数据结构实战开发启航
1、专业程序员的培养路线 2、课程目标 (1)创建可复用的数据结构软件库 (2)分析并优化C++课程中创建的实用类 3、使用的技术 (1)C++面向对象技术 (2)C++模板技术 (3)C++异常处理技术备注:本数据结构实战开发系列的学习资料来自狄泰软件学院的《数据结构实战开发教程》,有兴趣的同学可以加入qq群,群号是199546072...原创 2018-03-14 10:04:16 · 197 阅读 · 0 评论 -
进阶高手的大门
1、程序的本质 程序是为了解决实际问题而存在的。从本质上而言,程序是解决问题的步骤描述。 2、程序评鉴初探(优秀的开发者追求高质量的代码) (1)用尽量少的时间解决问题 (2)用尽量少的步骤解决问题 (3)用尽量少的内存解决问题 3、数据结构课程的研究范围 (1)非数值计算类型的程序问题 (2)数据间的组织和操作方式 (3)数据的逻辑结构和存储结构...原创 2018-03-14 10:05:47 · 147 阅读 · 0 评论 -
数据的艺术
重要概念: 1、数据的概念:数据是程序的操作对象,用于描述客观事物。 2、数据的特点: (1)可以输入到计算机 (2)可以被计算机程序处理 3、数据中的新概念 (1)数据元素:组成数据的基本单位 (2)数据项:一个数据元素由若干个数据项组成 (3)数据对象:性质相同的数据元素的集合 如: 4、数据结构 数据结构是指数据对象中数据元素之间的关系 (1)数据元素之间不是独立...原创 2018-03-14 10:08:37 · 240 阅读 · 0 评论 -
算法的时间复杂度
重点:学会大O表示法 问题:如何用符号定性地判断算法的效率? 算法的复杂度: — 时间复杂度 算法运行后对时间需求量的定性描述 — 空间复杂度 算法运行后对空间需求量的定性描述 下面分析时间复杂度: (1)大O表示法 ① 算法效率严重依赖操作Operation数量 ② 操作数量的估算可以作为时间复杂度的估算 ③ 在判断时首先关注操作数量的最高次项 常见时间复杂度: 线...原创 2018-03-14 10:12:31 · 145 阅读 · 0 评论 -
循环链表 CircleList的实现并解决约瑟夫环问题
本篇分析一下LinkList的另一个子类CircleList的实现,可参考以下两篇博客: (1)单链表LinkList的实现 (2)静态单链表StaticLinkList的实现 循环链表的定义(1)概念上 1、任意数据元素都有一个前驱和一个后继; 2、所高的数1居元素的关系构成一个逻辑上的环。 (2)实现上 1、循环链表是一种特殊的的单链表; 2、尾结点的指针域保存了首...原创 2018-03-22 08:57:31 · 619 阅读 · 0 评论