一、什么是数据结构
1.数据结构的起源
1968年,美国高德纳教授,《计算机程序设计艺术》第一卷《基本算法》的出版,开创了数据结构和算法的先河。
数据结构是一门研究数据之间关系和操作的学科,而非计算方法
数据结构+算法=程序,沃斯凭借这个观点拿到了图灵奖,这句话展示了程序的本质
2.数据结构的基本概念
数据:所有能输入到计算机中,能被程序处理的描述客观事物的符号
数据项:有独立含义的最小单位,也叫做域【结构的成员项】
数据元素:组成数据的,有一定意义的基本单位,也叫做节点、记录。一个数据元素由若干个数据项组成【结构变量】
数据结构:相互之间存在一种或多种特定关系的数据元素集合
算法:数据结构所具备的功能,解决特定问题的方法
3.数据结构的三个方面
数据的逻辑关系
数据的存储关系
数据结构的运算
二、逻辑关系和存储关系
数据的逻辑关系:
集合:数据元素同属于一个集合,但元素之间没有任何关系
线性结构:数据之间存在一对一的关系(表)
树型结构:数据元素之间存在一对多发关系(树)
图型结构:数据之间存在多对多的关系(图)
数据的存储结构:
顺序结构:数据元素存储在连续的内存中,用数据元素的相对位置来表示关系
优点:支持随即访问,访问效率高,适合查找数据
缺点:空间利用率读、对内存要求极高,插入、删除不方便
链式结构:数据元素存储在彼此独立的内存空间中,每个数据元素中增加一个数据项用于存储其它元素的地址,以此来表示数据元素之间的关系
优点:空间利用率高、插入、删除方便、适合频繁增删数据
缺点:不支持随机访问、只能从前到后逐个访问
逻辑结构与存储结构的对应关系:
表 顺序 链式
树 链式 顺序
图 顺序+链式
每种逻辑结构采用什么物理存储方式没有明确规定,通常根据实现的难易程度以及空间、时间方面的需求,来选择最合适的物理存储结构
三、数据结构的运算
1.建立数据结构 create
2.销毁数据结构 destory
3.清空数据结构 clean
4.数据结构排序 sort
5.插入元素 insert
6.删除元素 delete
7.访问元素 access
8.修改元素 modify
9.查询元素 query
10.遍历数据结构 show print ergodic
四、顺序表和链式表的实现
顺序表:
数据项:
存储元素的内存首地址
表的容量
元素的数量
运算:
创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历
注意:
1.不要越界
2.时刻保持元素的连续性
优点:
支持随机访问,修改、访问、排序的效率比较高,大块的连续的内存不容易产生内存碎片
缺点:
对内存要求比较高(内存连续),插入、删除元素时不方便、效率低
链式表:(list)
节点的数据项:
数据域:可以时若干个各种类型的数据项组成
指针域:指向下一个节点
由若干个节点通过指针域连接在一起,形成链式表
不带头节点的链表:第一个节点的数据域存储的是有效的数据
添加、删除时有可能会改变第一个节点的指针指向,参数需要传递二级指针,而且删除第一个节点时需要额外处理
带头节点的链表:第一个节点不参与存储有效数据,仅仅只是用于指向第一个数据域有效节点
注意:操作需要从第二个节点(也就是第一个有效数据节点)开始
功能受限的表:
栈:只有一个进出的出入口的表结构,先进后出,FILO
顺序栈:
数据项:
存储元素的内存首地址
栈的容量
栈顶的位置
运算:
创建、销毁、入栈、出栈、栈空、栈满、栈顶
注意:
满增栈,满减栈:栈顶指向顶部的第一个数据
空增栈,空减栈:栈顶指向接下去要入栈的位置
链式栈:
数据域:
栈顶
节点数量
运算:
创建、销毁、入栈、出栈、栈空、栈顶
栈的应用:
1.函数的调用(栈内存)
2生产者和消费者模型
3.表达式的解析
栈的常见笔试面试题目:
某个序列时入栈顺序,判断那个序列时合理的出栈顺序
实现一个函数,判断序列b是不是序列a的出栈顺序
bool is popstack(int *a,int* b,int len)
{
//创建一个栈
//按照a的顺序一个一个入栈
//按照b的顺序出栈
//最后判断栈是否为空
}
问题:两个顺序栈,如何使用能让空间使用率最大
队列:一个端口进,一个端口出,先进先出 FIFO
顺序队列:
数据项:
储存元素的内存首地址
容量
队头
队尾 接下去要入队的位置
运算:
创建、销毁,入队、出队、队空、队满、队头、队尾、元素个数
顺序队列是由一维数组+队头front位置+队尾位置rear组成,入队时rear+1,出队时front+1,为了能够让队列反复使用,我们要把一维数组想象成一个环,因此
rear、front加1后要用队列的容量求余
rear=(rear+1)%cal;
front=(front+1)%cal;
如何判断队空:front==rear
如何判断队满:
1.front==(rear+1)%cal 代价是空一格位置不能使用
2.添加一个数据项,标记队列是空还是满
如何计算元素的数量:
(rear-front+cal)%cal
链式队列:
由若干个节点组成的队列
数据项:
队头指针
队尾指针
节点
运算:
创建、销毁、队空、入队、出队、队头、队尾、数量
队列的应用:
1.消息队列
2.树的层序遍历
3.图的广度优先遍历
4.封装线程池、数据池