1、数组
数组是一种最简单最常用的数据结构,栈和堆皆由其衍生而来。每个数组的元素位置以数字编号成为下标或者索引,从0开始计算。
根据数组的维度来区分可以分为一维数组、多维数组。
将多维数组变为一维数组称为数组扁平化,下面列举几种数组扁平化的方式
1.使用reduce
const arrList=[[1,2],[3,4],[[5,6],[7,8]]]; const recur=(arrList)=>{ return arrList.reduce((pre,cur)=>{ return pre.concat(Array.isArray(cur)?recur(cur):cur) },[]) } const result=recur(arrList)
2.使用map
const arrList=[[1,2],[3,4],[[5,6],[7,8]]]; const recur=(arrList)=>{ return [].concat(...arrList.map(item=>Array.isArray(item)?recur(item):item)) } const result=recur(arrList)
3.使用flat
const arrList=[[1,2],[3,4],[[5,6],[7,8]]]; const result=arrList.flat(Infinity)//使用 Infinity,可展开任意深度的嵌套数组
4.使用递归
const result=[]; const arrList=[[1,2],[3,4],[[5,6],[7,8]]]; const recur=arrList=>{ for(let i=0;i<arrList.length;i++){ if(Array.isArray(arrList[i])) recur(arrList[i]) else result.push(arrList[i]) } }
5.使用apply
const arrList=[[1,2],[3,4],[5,6],[7,8]]; const result=[].concat.apply([],arrList);//弊端:只能用于二维数组,不能用于多维数组
6.通过split
const arrList=[[1,2],[3,4],[5,6],[7,8]]; const result=(arrList+'').split(',');//弊端:只能用于二维,并且转过来的数组元素是字符串
数组拥有很多处理方法,这里就不一一赘述,详情请自行百度
2、栈
定义:栈是一种只能从表一端存取数据且遵循先进后出(LIFO)的原则的线性存储结构
操作:根据栈结构的特点,通常我们对栈的操作只有出栈(向栈中提取指定元素)和入栈(向栈中添加元素)两种
实现方式:顺序栈(采用顺序存储结构模拟栈存储数据的特点从而实现,底层采用数组)和链栈(采用链式存储结构实现,底层采用的是链表)
应用:浏览器的回退,ctrl+z的实现,十进制二进制的转换
3、队列
队列是一种遵循先进先出(FIFO)原则的线性存储结构。但是队列只允许在表的前端进行删除操作,在表的后端进行插入操作。而进行插入操作的称为队尾,删除操作的叫队头
溢出:
(1)下溢:当队列为空时,做出队运算产生的现象。“下溢”是正常现象,常用作程序控制转移的条件
(2)真上溢:当队列满时,做出栈运算产生的现象。
(3)假上溢:由于出队和入队的操作中,头尾指针只增不减导致被删除的空间无法被重复利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作,该现象就叫假上溢。
4、链表
链表也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。
链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为 null。
链表分为单向链表和双向链表
链表可以用来实现文件系统、哈希表和邻接表。
5、树
树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。
特性:
1、每个节点可以拥有多个子节点,而该节点是对应子节点的父节点
2、每个树都有一个没有父节点的节点,该节点叫根节点
3、没有子节点的节点叫做叶节点
4、若两个节点拥有相同的父节点,则这两个节点为兄弟节点
5、一个节点的子节点以及子节点的后代称为子树
深度高度:一个树的深度和高度都是从该树的根节点开始计算的。深度从1开始累计,高度从0开始累计
二叉树:二叉树一种是特殊的树。他是每个节点最多拥有两个子树的树结构。通常子树称为左子树和右子树
6、哈希
定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。(百度百科)
7、图
图和散列表、二叉树一样,是一种非线性数据结构。图由一系列顶点以及连接顶点的边构成。由一条边连接在一起的顶点成为相邻顶点,一个顶点相邻顶点的数量叫作度。路径指相邻顶点的一个连续序列,环指首尾顶点相同的路径。如果图中每两个顶点之间都有路径相连,则称该图是连通的。
如果图中的边具有方向,称该图为有向图。如果图中的边是双向的,则该图是强连通的