自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一念之间、

生命不停,学无止境。

  • 博客(26)
  • 资源 (4)
  • 收藏
  • 关注

原创 数据结构--双向链表

单链表的单向性:只能从头结点开始高效访问链表中的数据元素。单链表还存在另一个缺陷:逆序访问时候的效率极低。如下: 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 282

原创 数据结构--循环链表

概念上的循环链表是任何数据元素都有一个前驱和一个后继,首结点的前驱是尾结点,尾结点的后继是首结点,所有数据元素的关系在逻辑上构成一个环,而单链表是除了首尾数据结点外都有前驱和后继。实现上循环链表是一种特殊的单链表,在尾结点的指针域中保存了首结点的地址。如图所示:实现设计思路:通过类模板实现。继承自LinkList类。定义指向最后一个结点的函数。定义首尾相

2017-12-26 12:27:13 371

原创 数据结构--另一种智能指针-SharedPointer

上一篇讲了最多只能由一个指针标识堆空间的SmartPointer,本篇讲解另一种智能指针--SharedPointer。设计要点:使用类模板实现。继承自Pointer类通过计数机制(ref)标识堆空间:被指向时ref++;指向的指针被置空时ref--;当计数变量ref为0时堆空间应该被释放。所以计数变量和堆空间对象是绑定在一起。由于SharedPointer支持多个对象同时指向

2017-12-24 15:53:52 1360

原创 数据结构--重构智能指针SmartPointer

思考一个问题,能否使用智能指针(SmartPointer)替换单链表(LinkList)中的原生指针?经过尝试发现替换后的单链表在遍历数据时程序直接爆掉,那么问题出在哪里?首先回忆一下SmartPointer的设计实现:指针生命周期结束时主动释放堆空间。一片堆空间最多只能由一个指针标识。杜绝指针运算和指针比较。问题就出在智能指针只能由一个指针标识,当对链表进行遍历时就需要多个指

2017-12-24 12:54:43 304

原创 数据结构--静态单链表

学习了顺序表和单链表为什么还要学习静态单链表?顺序表和单链表的优势劣势不都分析了吗(见上一篇文章)?我想,存在即合理,那么我们就先分析分析为什么还会有这个需求。问一个问题,如果需要频繁且长时间的增删数据元素应该选择哪种线性表?首先看到大量增删肯定会想到单链表,因为它不需要移动结点,效率会高不少,但是单链表真的是理想的选择吗?如果需要的数据最大个数是固定的呢?这就是需要实现静态单链表的原因之一。

2017-12-21 22:47:32 767

原创 数据结构--顺序表和单链表的比较

顺序表和单链表的时间复杂度对比:发现单链表的时间复杂度总体来说效率并没有高于顺序表,但是为什么还需要实现单链表?首先在实际工程中时间复杂度只是效率的一个参考指标。对于内置类型,顺序表和单链表的效率不相上下。对于自定义类型,顺序表的效率低于单链表。当数据元素是自定义类型时,顺序表在插入和删除时就会耗费大量的时间,由于移动元素需要进行深拷贝,而对于单链表操作

2017-12-19 22:50:37 1299

原创 数据结构--单链表实现

上一篇讲到了链式存储结构的基本操作,本篇就对具体操作在代码层上进行实现。我们需要设计一个单链表的类LinkList:使用类模板实现。继承自List类。通过头结点访问后继结点。定义内部结点类型Node,用于描述数据域和指针域。类里实现链表的关键操作(增删待查等等)。看一个LinkList类的声明: template class LinkList : p

2017-12-19 21:44:53 247

原创 数据结构--链式存储结构

通过对之前学过的线性表进行时间复杂度分析总结出顺序存储结构线性表的最大问题就是插入和删除需要移动大量的元素,严重影响了效率。为了提高效率,引出一种在逻辑结构上相连但在物理结构上不相连的存储方式--链式存储结构。链式存储结构的定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,创建一种结构,结构除了需要存储数据元素本身的信息之外还需要存储其直接后继的信息。如下图:

2017-12-19 13:31:58 4746

原创 数据结构--数组类之DynamicArray类

上一篇我们实现了Array的子类:StaticArray类,今天我们实现Array的另一个子类:DynamicArray类。DynamicArray类的设计要点:用类模板实现。继承自Array类。动态确定内部数组空间的大小。实现返回数组长度的函数。实现拷贝构造和赋值操作功能。对重复逻辑进行优化。下面是DynamicArray类的声明: template

2017-12-19 09:54:37 3693 2

原创 数据结构--数组类之StaticArray类

原因分析首先问一下为什么需要实现一个数组类?先看一段小程序: StaticList s1; for(int i = 0; i < s1.capacity(); i++) { s1[i] = i*i; } 这是想干什么?将线性表当做数组使用。但是操作可行吗?答案是肯定是不允许的,因为线性表都还没有元素插入怎么能直接

2017-12-18 22:28:17 973

原创 数据结构--线性表之DynamicList类

DynamicList类的设计要点:同样使用类模板继承自SeqList申请连续的堆空间作为顺序存储空间动态设置顺序存储空间的大小保证重置顺序存储空间时的异常安全性。什么叫做异常安全:不泄露任何资源和不允许破坏需要的数据。函数异常安全的保障:如果有异常抛出时,对象内的任何成员仍然能保持有效状态,没有数据的破坏及资源泄漏。先看总体设计: template

2017-12-18 11:28:06 383

原创 数据结构--线性表之StaticList类

StaticList设计要点:首先依旧还是使用类模板实现继承自SeqList使用原生数组作为顺序存储空间使用数值模板参数决定数组大小实现如下: template class StaticList : public SeqList { protected: T m_space[N];//顺序存储空间,N为模板参数 pub

2017-12-18 10:54:54 228

原创 数据结构--顺序存储结构及抽象实现

顺序存储的定义:线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表中的数据元素,例如原生数组。设计思路:利用一维数组来实现顺序存储结构。存储空间:T* m_array;当前长度:int m_length;它继承自线性表抽象类List(见上一篇)。下面分析线性表的增删改查等功能。一、插入元素1、判断目标位置是否合法2、将目标位置及其之后的所有元素

2017-12-17 22:45:03 531

原创 数据结构--线性表

线性表的表现形式:零个或多个数据元素组成的集合。数据元素在位置上是有序排列的。数据元素的个数是有限的。数据元素的类型必须相同。我们可以抽象出来线性表的定义:线性表是具有相同类型的n(n >= 0)个数据元素的有限序列,(a0,a1,a2,a3,a4,,,,,an-1),其中ai叫表项,即数据元素,n为表长。线性表的存在有它独有的性质:a0为线性表的第一个元素,只有一

2017-12-17 22:23:30 262

原创 C++学习笔记--重载new和delete

前面说过new申请的空间在堆空间上,那么我们能不能将new回来的空间存放在其他地方呢?能,那么该如何操作?首先关注下new和delete的被忽略的东西:new/delete本质上是C++预定义的操作符。C++对这两个关键字做了严格的定义。new:获取足够大的空间,默认是堆空间上,使用new一个对象的空间时会调用构造函数;delete:会调用析构函数释放占用的空间,默认还是在堆空间,ne

2017-12-13 23:09:40 258

原创 C++学习笔记--数组类模板、智能指针模板、单例类模板

上一节中讲到类模板,本节就针对类模板常用的例子来强化类模板。数组类模板前面讲过类模板的泛指类型参数,在模板参数中除了类型参数还有一种数值型参数,数值型参数也有他自身的限制:变量不能作为模板参数,什么意思呢?在声明了一个数值型参数后不能指定一个变量作为实际类型参数。浮点数不能作为模板参数。类对象不能作为模板参数。本质上就是说数值型模板参数是在编译阶段被处理的单元,因此在编译阶

2017-12-09 21:13:41 302

原创 C++学习笔记--类模板

C++中将泛型思想引入到了类,实现了类模板,使得类的实现不再关注数据元素的具体类型,而只关注类所需实现的功能,适用于编写数据结构相关代码。C++中的类模板以相同的方式处理不同的类型,在类的声明前使用template关键字标识将要泛型编程,用于说明类中使用的T是泛指类型,类模板只能显式指定具体类型,无法像函数模板那样能够自动推导,下面给出定义过程和使用方法:template class O

2017-12-09 10:35:04 182

原创 C++学习笔记--函数模板

泛型编程就是不考虑具体数据类型的编程方式。而C++中存在一种泛型编程方式,函数模板。函数模板是一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化,形如下面:template void Swap(T& a, T& b){ T c = a; a = b; b = c;}其中,template关键字用于声明开始进行泛型编程,typename

2017-12-08 22:48:16 144

原创 C++学习笔记--多重继承的问题

C++中允许一个类继承自多个类,所以可以编写多重继承的代码,一个子类可以拥有多个父类,继承关系和普通继承一样,子类拥有父类所有的成员变量和成员函数,并且子类可以当做任意的父类使用。多重继承的语法规则是:class Derived : public BaseA, public BaseB{ };其本质还是和单继承是一样的,子类中的变量排布也是先父类再子类,父类的排布顺序由继承顺序决定

2017-12-08 10:04:32 1103

原创 C++学习笔记--抽象类-纯虚函数

什么是抽象类?面向对象中的抽象类可用于表示现实世界中的抽象概念,是一种只能定义类型,而不能产生对象的类,它只能被继承并重写相关函数,在抽象类中的相关函数最直接的表现特征就是没有完整的实现。比如现实世界中的图形,它是一个抽象的概念,但是又无法缺少,如果将图形做成一个类的话那么图形就可以说成是一个抽象类,如果我们说要对图形求面积的话是行不通的,因为没有指定具体的图形类型,没有任何意义,但是现实中缺少了

2017-12-07 22:50:21 550

原创 C++学习笔记--类对象、继承、多态的内存模型

以前我们学习过结构体变量在内存中是如何排布的,那么对于一个类对象,内存中又是如何排布的?在学习class关键字之前我们是使用struct关键字来创建一个类的,它与class仅有的区别就是默认的访问级别不同,struct的默认访问级别是public,class的默认访问级别是private。所以,class只是一个特殊的struct,在内存中依旧可以看做变量的集合,class遵循与struct相

2017-12-05 21:50:52 350

原创 C++学习笔记--多态、虚函数

前面一节课中讲到了函数重写,最后也提出了一个问题,怎么解决函数重写和赋值兼容之间的问题?首先回顾下,父类中被重写的函数依然会继承给子类,只是子类中的重写函数会覆盖父类的 被重写函数。但是当函数重写和赋值兼容遇上了后编译器为了安全着想只会调用父类中的函数,这显然不符合我们的期望。而面向对象中期望的行为是:根据实际的对象类型来判断如何调用重写函数。父类指针(引用)指向(替代)父类对象则调用

2017-12-04 16:45:16 181

原创 C++学习笔记--继承的赋值兼容和函数重写

首先说说父类子类间的赋值兼容问题,什么意思呢,就是子类对象可以当做父类对象使用的兼容性问题。子类对象可以直接赋值给父类对象。子类对象可以直接初始化父类对象。父类指针可以直接指向子类对象。父类引用可以直接引用子类对象。我们通过小例子说明这几个规则,首先定义一个父类一个子类,他们之间有继承关系。class Parent{public: int mi;

2017-12-04 11:31:49 466

原创 C++学习笔记--继承中的同名变量和同名函数

同名成员子类中是否可以定义与父类同名的变量?如果可以的话该怎么区分?可不可以试试就知道了。class Parent{public: int mi;};class Child : public Parent{public: int mi;};我们发现编译器是能通过编译的,说明父类与子类中可以定义同名变量。如果定义了一个子类对象c,那么c.mi = 100;

2017-12-03 20:29:47 1985 2

原创 C++学习笔记--继承中的构造与析构

当一个子类继承了父类后,在子类中如何初始化父类成员?子类中可以定义构造函数,而且必须对继承而来的成员进行初始化,可以直接通过初始化列表或在子类构造时通过给父类成员变量赋值的方式进行初始化父类的成员变量和在子类构造的时候直接调用父类构造函数。但是直接赋值有可能行不通,因为父类的私有成员变量是无法在外界访问的,那么此时就只能通过父类的构造函数来进行初始化工作了,父类构造函数在子类中有两种调用方式,默认

2017-12-02 23:55:29 200

原创 C++学习笔记--组合、继承

简单继承三句话描述继承:代码复用(子类可以完全当做父类使用)、面向对象(属性和方法描述)、长江后浪推前浪(子类不仅可以使用父类的所有属性和行为,还可以自定义自身特有的属性和行为 )。类与类之间存在什么联系吗?当然有的,组合和继承。组合就是一个类的成员变量包含其他的类对象。我们今天讲的主要是继承。什么叫做继承呢?从字面上看就是全部获取的意思。面向对象中的继承指的是类之间的父子关系,父类也...

2017-12-01 23:17:51 204

基于STM32的智能节水控制系统

本次设计一种IC卡刷卡收费节水控制系统实现对水资源的有效管理,拒绝浪费,节约用水。该系统采用IC射频卡作为系统控制钥匙来控制出水时间及出水量,这是利用一种现代无线射频感应技术,通过用户预估使用水量对应的时间达到节约用水的目的。通过键盘输入预设时间,经确认后刷卡认证一下即可出水,同时显示剩余时间和射频卡剩余水费,并控制电磁阀打开水龙头;显示预扣设定水费开始倒计,用完停水;中途如需停用按水控机上的暂停键即可,按下恢复键继续出水。 系统主要分为七大部 1、MCU控制器:STM32F103C8T6 2、按键部分用于设置时间和暂停出水操作 3、电源为普通数据线实现5V供电 4、存储芯片用于保存对应IC卡所剩余额 5、射频卡用于用户验证,蜂鸣器做提示工作 6、OLED显示屏显示所有信息,包括剩余时间和剩余水费,以及一些提示性界面 7、继电器和LED灯共同模拟水龙头的开关和工作状态

2021-03-28

基于STM32的语音功能的电子密码锁

本套智能入户门系统是基于STM32单片机的控制下实现的密码开锁和语音控制开锁。一、当用户在矩阵键盘上输入密码确认完成后由单片机驱动继电器打开电子锁模块,三次失败则报警。二、当选择单片机通过语音模块进行语音识别后与单片机中存储的信息进行匹配,在信息匹配正确的情况下由单片机驱动继电器模块打开电子锁模块然后打开房间的智能门系统。三、该系统支持报警功能、修改密码功能、显示信息功能。

2021-03-28

基于STM32的家庭安防控制系统

设计了一种基于互联网的家庭安防监控系统,实现防盗、防火、燃气泄漏、报警、通信等功能。对家的安全进行多方位的监测。 .该系统采用STM32F103C8T6做为主控对该监测系统进行控制,利用现代传感技术及WiFi通信技术。对室内烟雾,火焰,陌生人员进出,燃气进行监控并能通过WiFi进行数据实时传输及报警的新型安防监控装置。利用各类传感器对室内环境进行监测,通过OLED显示采集到的数据,通过蜂鸣器作为报警响应。

2021-03-28

基于stm32的电子密码锁

基于STM32单片机的控制下实现手机端与单片机通信,使用到stm32单片机、蓝牙模块、液晶显示、密码存储与更改、系统自动报警、4*4矩阵键盘、蓝牙调试助手 支持功能:键盘上设定好六位密码,可以在键盘上改密码, 用键盘输入设定的正确密码按确认后开锁,输入错误密码达到3次系统报警,使用手机接收到系统的蓝牙信号打开调试助手输入正确密码开锁,输入错误密码达到3次报警,液晶显示,用于直观地提示用户输入开锁密码、密码信息的正误提示、开锁信息的显示等,显示整个电子密码锁的工作状态。

2020-12-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除