![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 81
一念之间、
自古闲人多愁绪,唯有读书稳人心!
展开
-
数据结构--数组类之StaticArray类
原因分析首先问一下为什么需要实现一个数组类?先看一段小程序: StaticList s1; for(int i = 0; i < s1.capacity(); i++) { s1[i] = i*i; } 这是想干什么?将线性表当做数组使用。但是操作可行吗?答案是肯定是不允许的,因为线性表都还没有元素插入怎么能直接原创 2017-12-18 22:28:17 · 942 阅读 · 0 评论 -
数据结构--数组类之DynamicArray类
上一篇我们实现了Array的子类:StaticArray类,今天我们实现Array的另一个子类:DynamicArray类。DynamicArray类的设计要点:用类模板实现。继承自Array类。动态确定内部数组空间的大小。实现返回数组长度的函数。实现拷贝构造和赋值操作功能。对重复逻辑进行优化。下面是DynamicArray类的声明: template原创 2017-12-19 09:54:37 · 3647 阅读 · 2 评论 -
数据结构--双向链表
单链表的单向性:只能从头结点开始高效访问链表中的数据元素。单链表还存在另一个缺陷:逆序访问时候的效率极低。如下: LinkList list; for(int i = 0; i < 5; i++) { list.insert(0,i); } for(int i = list.length() - 1; i >= 0;原创 2017-12-27 11:35:44 · 268 阅读 · 0 评论 -
数据结构--链式存储结构
通过对之前学过的线性表进行时间复杂度分析总结出顺序存储结构线性表的最大问题就是插入和删除需要移动大量的元素,严重影响了效率。为了提高效率,引出一种在逻辑结构上相连但在物理结构上不相连的存储方式--链式存储结构。链式存储结构的定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,创建一种结构,结构除了需要存储数据元素本身的信息之外还需要存储其直接后继的信息。如下图:原创 2017-12-19 13:31:58 · 4704 阅读 · 0 评论 -
数据结构--顺序存储结构及抽象实现
顺序存储的定义:线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表中的数据元素,例如原生数组。设计思路:利用一维数组来实现顺序存储结构。存储空间:T* m_array;当前长度:int m_length;它继承自线性表抽象类List(见上一篇)。下面分析线性表的增删改查等功能。一、插入元素1、判断目标位置是否合法2、将目标位置及其之后的所有元素原创 2017-12-17 22:45:03 · 498 阅读 · 0 评论 -
数据结构--KMP算法
要完善一个String字符串类,那么实现查找子串的功能是必不可少的,实现子串查找可以使用朴素算法,每次匹配一个字符后向右移动一个位置,这样执行下来效率是比较低的,所以就有了KMP算法,它能够准确的知道当前字符不匹配后字符串应该向右移动多少位,由于刚接触KMP算法,所以很多可能还明白的不是很透彻,在此记录在学习KMP算法过程中的一些理解。先看一张利用KMP算法得出的一张字符匹配图:原创 2018-01-21 22:48:49 · 570 阅读 · 0 评论 -
数据结构--字符串类String(一)
在C语言中不支持真正意义上的字符串,C中用字符数组加上'\0'配合起来作为字符串,再配合一组函数实现字符串的操作,如strcpy、strcmp等等。C语言不支持自定义类型,因此无法获得字符串类型。从C到C++的进化过程中引入了自定义数据类型,所以在C++中就能通过类类型来完成字符串类型的定义。在我们的模板库中为何需要实现字符串类?STL标准库中有cstring类,QT中有qstring,那原创 2018-01-20 11:46:19 · 1911 阅读 · 0 评论 -
数据结构--字符串类String(二)
在之前字符串类中的实现后只能算是咱们的String类可以简简单单的使用了,但是离功能强大几乎还沾不到边,所以今天我们在之前的基础上添加一些String类的字符串操作函数。上一篇文章中学习了KMP算法,今天我们就把它用起来,添加到String类中实现子串查找。除了实现子串查找,我们还需要添加删除子串、实现字符串减法、字符串替换和提取子串等基本的增删改查的操作。子串查找:IndexOf原创 2018-01-22 11:38:35 · 305 阅读 · 0 评论 -
数据结构--顺序栈StaticStack
学习栈我们要知道栈是什么,有什么特点?首先栈是一种特殊的线性表,其特殊在栈仅能在线性表的一端进行操作,其中栈顶(Top)是允许操作的一端,栈底(Bottom)是不允许操作的一端。栈的唯一特性就是Last In First Out,即后进先出,也可以说栈 的特性是先进后出。看一个进栈和出栈的图理解后进先出的意义:知道了栈 的特性后就该进行栈操作了,那栈有哪些操作?创建栈(St原创 2018-01-11 10:30:34 · 218 阅读 · 0 评论 -
数据结构--链式栈LinkStack
上一讲学习了栈以及顺序栈的实现,本讲我们继续学习另一种栈--链式栈什么叫链式栈,就是和链表类似,不过它需要遵守栈的特性,只能操作其中一端,我们不需要从头创建一个链式栈,只在单链表的基础上进行实现即可。链式栈的设计要点:类模板编程。继承自抽象父类Stack。在内部组合使用LinkList类实现链式存储。只在单链表的其中一端进行操作。具体实现如下:templatecl原创 2018-01-11 11:32:45 · 1514 阅读 · 0 评论 -
数据结构--线性表之DynamicList类
DynamicList类的设计要点:同样使用类模板继承自SeqList申请连续的堆空间作为顺序存储空间动态设置顺序存储空间的大小保证重置顺序存储空间时的异常安全性。什么叫做异常安全:不泄露任何资源和不允许破坏需要的数据。函数异常安全的保障:如果有异常抛出时,对象内的任何成员仍然能保持有效状态,没有数据的破坏及资源泄漏。先看总体设计: template原创 2017-12-18 11:28:06 · 352 阅读 · 0 评论 -
数据结构--线性表之StaticList类
StaticList设计要点:首先依旧还是使用类模板实现继承自SeqList使用原生数组作为顺序存储空间使用数值模板参数决定数组大小实现如下: template class StaticList : public SeqList { protected: T m_space[N];//顺序存储空间,N为模板参数 pub原创 2017-12-18 10:54:54 · 222 阅读 · 0 评论 -
数据结构--顺序表和单链表的比较
顺序表和单链表的时间复杂度对比:发现单链表的时间复杂度总体来说效率并没有高于顺序表,但是为什么还需要实现单链表?首先在实际工程中时间复杂度只是效率的一个参考指标。对于内置类型,顺序表和单链表的效率不相上下。对于自定义类型,顺序表的效率低于单链表。当数据元素是自定义类型时,顺序表在插入和删除时就会耗费大量的时间,由于移动元素需要进行深拷贝,而对于单链表操作原创 2017-12-19 22:50:37 · 1274 阅读 · 0 评论 -
数据结构--单链表实现
上一篇讲到了链式存储结构的基本操作,本篇就对具体操作在代码层上进行实现。我们需要设计一个单链表的类LinkList:使用类模板实现。继承自List类。通过头结点访问后继结点。定义内部结点类型Node,用于描述数据域和指针域。类里实现链表的关键操作(增删待查等等)。看一个LinkList类的声明: template class LinkList : p原创 2017-12-19 21:44:53 · 227 阅读 · 0 评论 -
数据结构--静态单链表
学习了顺序表和单链表为什么还要学习静态单链表?顺序表和单链表的优势劣势不都分析了吗(见上一篇文章)?我想,存在即合理,那么我们就先分析分析为什么还会有这个需求。问一个问题,如果需要频繁且长时间的增删数据元素应该选择哪种线性表?首先看到大量增删肯定会想到单链表,因为它不需要移动结点,效率会高不少,但是单链表真的是理想的选择吗?如果需要的数据最大个数是固定的呢?这就是需要实现静态单链表的原因之一。原创 2017-12-21 22:47:32 · 740 阅读 · 0 评论 -
数据结构--重构智能指针SmartPointer
思考一个问题,能否使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针?经过尝试发现替换后的单链表在遍历数据时程序直接爆掉,那么问题出在哪里?首先回忆一下SmartPointer的设计实现:指针生命周期结束时主动释放堆空间。一片堆空间最多只能由一个指针标识。杜绝指针运算和指针比较。问题就出在智能指针只能由一个指针标识,当对链表进行遍历时就需要多个指原创 2017-12-24 12:54:43 · 291 阅读 · 0 评论 -
数据结构--另一种智能指针-SharedPointer
上一篇讲了最多只能由一个指针标识堆空间的SmartPointer,本篇讲解另一种智能指针--SharedPointer。设计要点:使用类模板实现。继承自Pointer类通过计数机制(ref)标识堆空间:被指向时ref++;指向的指针被置空时ref--;当计数变量ref为0时堆空间应该被释放。所以计数变量和堆空间对象是绑定在一起。由于SharedPointer支持多个对象同时指向原创 2017-12-24 15:53:52 · 1323 阅读 · 0 评论 -
数据结构--线性表
线性表的表现形式:零个或多个数据元素组成的集合。数据元素在位置上是有序排列的。数据元素的个数是有限的。数据元素的类型必须相同。我们可以抽象出来线性表的定义:线性表是具有相同类型的n(n >= 0)个数据元素的有限序列,(a0,a1,a2,a3,a4,,,,,an-1),其中ai叫表项,即数据元素,n为表长。线性表的存在有它独有的性质:a0为线性表的第一个元素,只有一原创 2017-12-17 22:23:30 · 238 阅读 · 0 评论 -
数据结构--循环链表
概念上的循环链表是任何数据元素都有一个前驱和一个后继,首结点的前驱是尾结点,尾结点的后继是首结点,所有数据元素的关系在逻辑上构成一个环,而单链表是除了首尾数据结点外都有前驱和后继。实现上循环链表是一种特殊的单链表,在尾结点的指针域中保存了首结点的地址。如图所示:实现设计思路:通过类模板实现。继承自LinkList类。定义指向最后一个结点的函数。定义首尾相原创 2017-12-26 12:27:13 · 330 阅读 · 0 评论 -
数据结构--线性表C实现
数据结构的初学者,在此分享一些学习小成果。 我们将一堆数据形如A1,A2,A3,,,,An有序排列称为含有n个元素的线性表。一般情况线性表的实现都是基于数组实现的。在线性表的使用中,我们需要实际估计表的大小以动态申请空间足够的的数组容量,由于稳妥起见,一般都需要将空间估算得大一些,所以就导致了空间浪费,这也是它的一个比较严重的缺点。但是,在一些比较小的地方并且我们能够大致估计容量时就可原创 2017-11-13 23:14:53 · 307 阅读 · 0 评论 -
数据结构--单链表C实现
什么叫结构体?就是能够将不同数据类型集合在一起构造一个新的数据类型的东西,它有一个注意点就是不能引用自身作为结构体成员,为什么呢?因为在创建这种类型的结构体变量时计算机无法得知给结构体变量分配多大的内存导致编译器报错,提示非法操作。那么为什么计算机无法给结构体变量分配某个固定内存呢?是这样的,如果你的结构体原先已经存在两个int型变量了,如果计算机是四字节对齐的话那么结构体类型目前已经占据了8个字原创 2017-11-14 16:20:12 · 295 阅读 · 0 评论 -
数据结构--队列
今天学习数据结构中的队列。首先,队列也是一种特殊的线性表,前面说到栈也是一种特殊的线性表,所以我们对比着学习队列的相关知识和操作。我们知道栈只能操作线性表的某一端,所以说它特殊;队列也特殊,它特殊在仅能在线性表的两端操作,而且入队和出队各在一端,不能混淆。队列有两端:队头和队尾。队头:取出数据元素的一端。队尾:插入数据的一端。队列有一个它独有的特性--先进先出。原创 2018-01-13 21:53:14 · 334 阅读 · 0 评论