数据结构
学习数据结构实例教程书籍,主要是了解数据结构中的一些基本概念,为学习数据结构和算法课程做准备
学习内容
线性表
- 顺序表和链表(链表包含了单链表、双向链表、循环链表和静态链表)
- 栈和队列
- 串(字符串)
- 数组和广义表
非线性表
- 树和二叉树
- 图
算法
- 查找(待学习)
- 排序(待学习)
概念
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合,包括三方面内容:数据的逻辑结构、数据的存储结构和数据的操作.数据的逻辑结构
数据的逻辑结构是指数据元素之间存在的固有的逻辑关系,常简称为数据结构
- 集合
结构中的数据元素之间除了“同属于一个集合”的关系以外,没有其他关系- 线性结构
结构中的数据元素之间存在“一对一”的关系- 树形结构
结构中的数据元素之间存在“一对多”的关系- 图形结构
结构中的数据之间存在“多对多”的关系
数据的存储结构
数据元素及其关系在计算机内的表示称为数据的存储结构- 顺序存储结构
把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系.- 链式存储结构
借助指针表达数据元素之间的逻辑关系- 索引存储结构
在存储数据元素的同时,还建立附加的索引表- 散列存储结构
根据散列函数和处理冲突的方法确定数据元素的存储位置
数据的操作
数据的操作是在数据的逻辑结构上定义的操作算法,如插入、删除、检索等.
一. 线性表
线性表是由n(n>=0)个具有相同性质的数据元素a1,a2,…an组成的有穷序列.线性表可以用顺序存储结构和链式存储结构来表示,分别称为顺序表和链表
1. 顺序表
用一组地址连续的存储单元依次存储线性表中的每一个数据元素,这种存储结构称为线性表的顺序存储结构,用这种结构表示的线性表称为顺序表
2. 链表
链式存储结构和顺序存储结构不同的是:它不要求逻辑上相邻的数据元素在物理位置上也相邻(用一组地址任意的存储单元依次存储线性表中的各个数据元素),它通过指针来表示数据元素之间的逻辑关系;包含数据域和指针域.
- 单链表
由于链表中每一个链结点中仅包含一个指针域(指向其后继结点),所以称这样的链表为单链表- 循环链表
他的特点是链表中的最后一个结点的指针域不为空,而是指向头结点,从而是整个链表形成了一个环- 双向链表
他的特点是每个结点中既有指向后继结点的指针域,又有志向前驱结点的指针域- 静态链表
静态链表是一种比较特殊的链表,它用数组的存放线性表中的元素,但并不按数组下标依次存放,而是给每一个元素增加一个“指针域域”,用来存放下一个元素在数组中的位置(数组下标),从而构造一个用数组实现的链表,这种链表称为静态链表.
**顺序表和链表二者优缺点的比较**
顺序存储结构比较适合于长度不经常发生变化,不经常进行插入和删除操作,经常进行存取和查询操作
链式存储结构比较适合于线性表的长度不可以预知,需要频繁的进行插入和删除操作
3. 栈 Stack(后进先出LIFO)
栈是限定只能在一端进行插入和删除的线性表.允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.
根据所采用的存储结构不同,栈分为顺序栈和链栈
- 顺序栈
栈的顺序存储表示称为顺序栈- 链栈
栈的链式存储表示称为链栈
4. 队列 Queue(先进先出FIFO)
队列是限定在一端进行插入,在另一端进行删除的线性表.队列中运行插入的一端称为队尾,队列中允许删除的一端称为队头.
根据队列采用的存储结构不同,队列也分为顺序队列和链式队列
- 顺序队列
用顺序的存储方式实现的队列称为顺序队列- 链式队列
队列的链式表示称为链队列
栈和队列是受限制的线性表,他们与线性表的逻辑结构完全相同,所不同的是:
线性表允许在任何位置进行插入和删除操作;
而栈只允许在一端进行插入和删除操作;
队列只允许在一端进入插入操作,在另一端进行删除操作.
5. 串(字符串)
字符串是一种特殊的线性表,串是由n(n>=0)个字符组成的有限序列.
串与线性表比较:
1. 线性表的数据元素可以是任意数据类型,而串的数据元素只能是字符类型;
2. 线性表一次操作一个数据元素,而串一次操作多个数据元素
6. 数组
数组是n(n>=1)个具有相同数据类型数据元素a0,a1,···,an-1构成的有限序列,并且这些数据元素占用一片地址连续的存储单元.
7. 广义表
广义表是n(n>=0)个单个元素或子表组成的有限序列,其中子表又是一个个表.
从某种意义上说,数组和广义表是线性表的推广,即他们的数据元素构成线性表,而数据元素本身又是一个数据结构.
二. 非线性表
1. 树
树是由n(n>=0)个元素构成的有限集合
树的基本术语:
- 结点的度:结点所拥有的子树的个数
- 树的度:树中所有结点的度的最大值
- 叶结点:度为0的结点
- 分支结点:度不为0的结点称为分支结点
- 孩子结点和双亲结点:树中一个结点的子树的根结点称为孩子结点.该结点就称为孩子结点的双亲结点
- 兄弟结点:具有同一双亲的孩子结点互为兄弟结点
- 结点的祖先:从根到该结点所经分支上的所有结点,称为该结点祖先
- 结点的子孙:以某结点为根的子树中的任一结点都称为该结点的子孙
- 结点的层次:树是一种层次结构,树中的每个结点都处于某个层次上.
- 树的深度:树中所有结点的层次的最大值称为树的深度
- 有序树:如果树中各结点的子树是按照从左到右有序排列的,即各子树的位置不能交换,这样的树称为有序树.
- 无序树:如果树中的各个结点的子树排列是无序的,称为无序树
- 森林:m(m>=0)颗互不相交的树的集合称为森林.
2. 二叉树
二叉树是一类比较特殊的树,他的操作相对简单一些,因此,许多树的问题都转换成二叉树来处理.
二叉树是n(n>=0)个结点构成的有限集合
两种特殊形态的二叉树:
- 满二叉树
如果二叉树的所有分支结点都有左子树和右子树,并且所有叶子结点都在二叉树的最下一层,则成这样的二叉树为满二叉树- 完全二叉树
在一颗具有n个结点的二叉树中,如果他的结构与满二叉树的前n个结点的结构相同,则称这样的二叉树为完全二叉树.
二叉树的遍历(参照物是根结点)
- 前序遍历
访问根结点,前序遍历根结点的左子树,前序遍历根结点的右子树- 中序遍历
中序遍历根结点的左子树,访问根结点,中序遍历根结点的右子树- 后序遍历
后序遍历根结点左子树,后序遍历根结点右子树,访问根结点
这里的二叉树遍历很容易出错
3. 图
图中的数据元素称为顶点.在顶点集合V中,第i个顶点记作vi.
图中两个顶点vi和vj之间有关联关系,称为顶点vi和vj之间有一条边.在边集合E中,第k条边记作ek,ek=<vi,vj>
图是由顶点的非空有限集合和顶点间关系集合构成的数据结构.记作G=(V,E),其中V为顶点集合,E为顶点间关系/边的集合.
图的遍历方法主要有两种:深度优先搜索遍历(Depth-First Search,DFS)和广度优先搜索遍历(Breadth-First Search,BFS)
树的数据元素之间存在一对多的关系,而图的数据元素之间存在多对多的关系,即图中任意一个结点都有多个前驱结点和多个后继结点