一、数据结构基本概念
1、什么是数据结构
学习数据结构是为了提高程序代码的运行效率,为了更高效的完成工作。数据结构体是由数据和数据与数据之间的关系构成的。
2、数据结构与算法的关系
数据结构其实就是研究如何有效的组织数据,并提高数据的处理效率,通过研究各种数据之间的内部关系,使用某种特定的方式存储,在此基础上对数据实施各种操作,这种方式称为算法。
一个好的算法要有以下几个特点:
消耗时间少,消耗空间少,少bug易调试,结构性好,易读性高
3、时间复杂度:
公式: T(n) = O(f(n))
T(n) : 表示算法的渐进时间复杂度
f(n) : 程序运行的次数
O : 表示正比关系
二、顺序表
1、线性表
一对一的数据组成的关系
(1) 存在唯一的一个被称为"第一个"的数据元素
(2) 存在唯一的一个被称为"最后一个"的数据元素
(3) 处了第一个外,集合中每一个数据元素只有一个前驱节点
(4) 除了最后一个外,集合中每个数据元素均只有一个后驱节点
2、顺序表
顺序表设计一般而言,为了方便操作顺序表,需要一个专门管理顺序表的"管理结构体",管理结构体一般会包括:
(1) 顺序表总容量
(2) 顺序表当前最末元素下标位置
(3) 顺序表指针
优点:
(1)存储密度高,不需要多余的信息来记录数据的关系
(2)数据全部储存在一片连续的空间,调用方便
缺点:
(1)插入、修改数据是要成片移动,操作不方便
(2)需要一大片连续的空间,当数据过大时不方便存储
三、单向链表
1、概念
链表是由一个或者多个结构体通过指针的关系链接在一起的链式存储的线性表。
2、链表和顺序表的差异
(1)链表不需要和顺序表一样,在删除和插入数据时不需要成片移动
(2)链表不需要连续的储存空间,但是顺序表需要一片连续的储存空间
3、链表分类:
链表分为有头节点单向链表和无头节点单向链表,还有双向链表和循环链表
4、链表的基本操作分为以下几个步骤:
(1)节点设计
(2)初始化空链表
(3)增删节点
(4)链表遍历
(5)销毁链表
四、双向链表
双向链表结构和单向链表相似,只不过双向链表更加灵活方便,在运用场景中更加常见。
经过单向链表、双向链表的学习,可以总结链表的适用场合:
1.适合用于节点数目不固定,动态变化较大的场合
2.适合用于节点需要频繁插入,删除的场合
3.适合用于对节点查找效率不十分敏感的场合
五、栈和队列
栈是一种逻辑结构,是特殊的线性表,特殊在只能在固定一端操作,并且呈现“后进先出”的逻辑,队列也是一种逻辑结构,但是队列是在固定两端进行线性操作,呈现“先进先出”的逻辑。
栈:
栈只是一种数据逻辑,如何将数据存储于内存则是另外一回事,一般而言,可以采用顺序存储形成顺序栈,或者采用链式存储形成链式栈。
(1)顺序栈 顺序存储意味着开辟一块连续的内存用于存储数据节点,一般而言,管理栈数据除了需要一块连续的内存之外,还需要记录栈的总容量、当前栈的元素个数、当前栈顶元素位置,如果有多线程还需要配合互斥锁和信号量等信息,为了方便管理,通常将这些信息统一于一个管理结构体中。
(2)链式栈 链式栈的组织形式与链表无异,只不过插入删除被约束在固定的一端。为了便于操作,通常也会创建所谓管理结构体,用来存储栈顶指针、栈元素个数等信息。
队列:
(1)与其他的逻辑结构类似,队列可以采用顺序存储形成循环队列,也可以采用链式存储形成链式队列。顺序存储的队列之所以被称为循环队列,是因为可以利用更新队头队尾的下标信息,来循环地利用整个数组,出队入队时也不必移动当中的数据。
(2)与其他数据结构一样,管理循环队列除了需要一块连续的内存之外,还需要记录队列的总容量、当前队列的元素个数、当前队头、队尾元素位置,如果有多线程还需要配互斥锁和信号量等信息,为了便于管理,通常将这些信息统一于在一个管理结构体之中。
(3)链式队列和一般的链表差不多,但是只能在两端进行插入删除操作。