cpp
数据结构的模拟实现不会采⽤ malloc 和 free ,或者 new 和 delete 的⽅式,⽽是采⽤
静态的⾜够⼤的数组来模拟实现。
第一章 数据结构、算法与 STL
1.什么是数据结构?
cpp
官⽅定义:在计算机科学中,数据结构是⼀种数据组织、管理和存储的格式。它是相互之间存在⼀种
或多种特定关系的数据元素的集合。
说点通俗易懂的话,数据结构就是数据的组织形式,研究的就是把数据按照何种形式存储在计算机
中。
为什么会有数据结构?
随着计算机的发展和应⽤范围的拓展,计算机需要处理的数据量越来越⼤,数据类型越来越多,数
据之间的关系也越来越复杂。
这就要求⼈们对计算机加⼯处理的数据进⾏系统的研究,即研究数据的特性、数据之间存在的关
系,以及如何有效的组织、管理存储数据,从⽽提⾼计算机处理数据的效率。
数据结构这⻔学科就是在此背景上逐渐形成和发展起来的。
对数据结构更深层次的理解:数据结构研究的是数据本⾝的特性、数据与数据之间的关系,以及如何
在计算机中存储数据,从⽽⾼效的处理这些数据。
2.数据结构的三要素
1.逻辑结构
cpp
逻辑结构:数据中各元素之间的逻辑关系。
它只关⼼数据中各个元素之间的关系,并不关⼼数据是怎么在内存中存储的。




2.存储结构
cpp
存储结构⼜称物理结构,但是存储⼆字更能体现本意,后续我们统称存储结构。
存储结构顾名思义,就是数据在计算机中是如何存储的。
⽤⼤⽩话就是,怎么把这个数据结构存到计算机中。
数据的存储结构主要有顺序存储以及链式存储。

3.数据的运算
cpp
数据的运算(针对数据的各种操作),包括数据结构的实现,以及基于数据结构上的各种操作。
• 此时我们已经知道这⼀堆数据中各个元素之间的关系,也知道这堆数据应该在内存中如何存储。
• 接下来要做的就是实现我们的想法,就是真真正正的把数据存在计算机中(写代码),并且在存储
的基础上对数据进⾏各种操作。
各种操作就包括:
创建这个数据结构;增加数据;删除数据;查找数据;
修改数据;排序数据;输出数据;
总结下来就是:创 + 增删查改 + 其他

3.什么是算法
cpp
算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着
⽤系统的⽅法描述解决问题的策略机制。也就是说,能够对⼀定规范的输⼊,在有限时间内获得所
要求的输出。
算法是可以没有输⼊的,⼀定要有输出的。没有输出的算法是没有意义的。
简单来说算法就是⼀系列的步骤,⽤来将输⼊数据转化成输出结果。

4.算法好坏的度量
时间和空间的消耗情况就是我们度量⼀个算法好坏的标准,也就是时间复杂度和空间复杂度。
cpp
【事前分析法】
算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数
基本也就确定了。
⽐如求 1 + 2 + 3 + ... + n − 1 + n ,可以设计三种算法:

算法执行所需资源的个数与问题规模有关。因此可以根据算法执行过程中对空间的消耗来衡量算法的好坏,这就是空间复杂度。

算法中基本语句总的执行次数与问题规模有关。因此可以根据算法执行过程中,所有语句被执行的次数之和来衡量算法的好坏,这就是时间复杂度。
5.时间复杂度-大O表法



大O表法






最优、平均和最差时间复杂度



案例






6.空间复杂度
冒泡排序


递归求阶乘






7.STL



for循环在c++11中被引用
第二章 顺序表和vector
1.顺序表的概念
线性表的定义

线性表的每一个元素的类型都是一致的,例如:int a ={1,2,3,4,5};
a1是表头 a5是表尾 a3是a4的前驱 a4是a3的后继 如果一个表里面什么也没有是空表 也就是空集
a1也可以是a2的前驱 是相对来说的
线性表的顺序存储 - 顺序表

2.顺序表的模拟实现
往后实现各种数据结构的时候,如果不做特殊说明,默认里面存储的就是 int 类型的数据。
顺序表的实现方式
按照数组的申请方式,有以下两种实现方式:

动态申请是用new和delete
静态申请是int a =



3.创建

4.添加⼀个元素

尾插:


**时间复杂度:**直接放在后⾯即可,时间复杂度为 O(1)
头插:



时间复杂度:由于需要将所有元素右移⼀位,时间复杂度为 O (N) 。
任意位置插入

p后面的元素全部往后面进行平移

时间复杂度: 最坏情况下需要数组中所有元素右移,时间复杂度为 O (N) 。
5.删除⼀个元素
删除之前,要判断⼀下顺序表里面有没有元素
尾删

时间复杂度: 直接放在后面即可,时间复杂度为 O(1)
头删

全部左移删除最后一个
时间复杂度: 需要所有元素整体左移,时间复杂度为 O (N) 。
任意位置删除


时间复杂度: 最坏情况下,所有元素都需要左移,时间复杂度为 O (N) 。
6.查找元素
按值查找

时间复杂度: 最坏情况下需要遍历整个数组,时间复杂度为 O (N) 。
按位查找

时间复杂度: 这就是顺序表随机存取的特性,只要给我⼀个下标,就能快速访问到该元素。
时间复杂度为 O(1) 。
7.修改元素

时间复杂度为 O(1) 。
8. 清空顺序表

正常的情况是从后往前不断的进行遍历 然后进行一个一个删除,直接让n=0,会导致内存的泄露
9.封装静态顺序表

利用 C++ 中的结构体和类把我们实现的顺序表封装起来,就能简化操作





10.动态顺序表 - vector


int a10={ }这个创建方式就跟大小n的数组 所以vector<int> a8N就是创建N个vector
11.size / empty




12.begin / end


13.push_back / pop_back




14.resize+clear


.size会变成0

15.询问学号


16.寄包柜



17.移动零



因为是不复制数组 所以需要使用& swap() 是 交换两个变量值的函数。
18.颜色分类




19.合并两个有序数组





因为 nums2 剩下的元素肯定都比 nums1 当前处理过的部分小,所以直接无条件复制到 nums1 的前端即可。

时间复杂度是o(n+m)
20.pair
cpp
pair 是 C++ 标准库中的⼀个模板类,⽤于将两个值组合成⼀个单⼀对象,通常⽤于存储键值对或返
回多个值。它有两个公有成员 first 和 second ,分别表⽰第⼀个值和第⼆个值。

想要第一个值:p1.first 第二个值是:p2.second
typedef进行重命名
21.The Blocks Problem


本质是⼀个模拟题,可以用vector来模拟,注意细节问题。



22.拓展:ACM 模式 vs 核心代码模式


