数据结构主要研究和讨论以下三个方面的问题
1、数据集合中各个数据元素之间的逻辑关系,即数据的逻辑结构;
2、在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;
3、对各种数据结构进行的运算。
数据结构:是指相互有关联的数据元素的集合。在具有相同特征的数据元素集合中,各个数据元素之间存在有某种关系,这种关系反映了该集合中的数据元素所固有的一种结构。
在数据处理领域中,通常把数据元素之间这种固有的关系简单的用前后件来描述。
数据结构应包含两个方面的信息:
1、表示数据元素的信息
2、表示各种数据元素之间的前后件关系。
数据结构分类:
1、数据的逻辑结构,是指反映数据元素之间逻辑关系的数据结构;数据的存储结构,是指数据的逻辑结构在计算机存储空间中的存放形式。
2、数据的存储结构,根据需要表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构。采用不同的存储结构,处理数据的效率是不同的。
在数据结构中,没有前件的节点称为根结点;没有后件的节点称为终端结点。
对数据结点的运算包括增加、删除、修改、查找、复制、合并、分解。
根据数据结构中个数据元素之间前后件关系的复杂程度,一般分为两大类型:线性结构和非线性结构。
线性结构需满足一下两个条件:
1)有且只有一个根结点;
2)每一个结点最多只有一个前件、也最多只有一个后件。
则称该数据结构为线性结构,又称线性表。
线性表的顺序存储结构包含两个基本特点:
1)线性表中所有元素所占用的存储空间是连续的。
2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
在程序设计语言中,通常定义一个一维数组来表示表的顺序存储空间。因为程序设计语言中的一维数组与计算机中的实际存储空间结构是类似的。这便于对线性表进行各种运算。
在线性表中插入数据,一般情况下,如果在第i(0 ≤ i ≤ n)个元素之前插入一个元素,则第i个元素之后(包含第i个元素)的所有元素都必须移动。
在线性表中删除数据,一般情况下,如果要删除第i(0 ≤ i ≤ n)个元素,则要从第i+1个到第n个元素之间的所有元素都要依次向前移动一个位置。删除结束后,线性表中的长度减小1。
结论:顺序存储的这种方式对经常变动的大线性表是不太合适的,插入跟删除元素效率比较低,适用于插入、删除少,查询多的数据处理。
栈:栈是一种特殊的线性表,其插入与删除只在一端进行,另一端是封闭的,不允许进行插入与删除运算。
在栈中,允许插入、删除一端称为栈顶;而不允许插入、与删除的一端称为栈底。栈顶元素总是最后被插入的元素,从而也是最先被删除的元素。栈底元素总是最先被插入栈底的元素,从而也是最后才能被删除的元素。栈的特点“先进后出”(FILO-First In Last Out)。通常用指针top来表示栈顶的位置,用指针bottom指向栈底。
往栈中插入一个元素称为入栈运算,从栈中删除一个元素(即删除栈顶元素)称为退栈运算。
栈与一般的线性表一样,在程序设计中,用一维数组S(1:m)作为栈的顺序存储空间,其中m为栈的最大容量。S(top)为栈顶元素,S(bottom)为栈底元素。top=0表示空栈,top=m表示满栈。
栈的三种基本运算:入栈、退栈(删除栈顶元素)、读栈(读取栈顶元素不删除)。
队列:在线性表中,需要加入的元素总是插入到线性表的末尾,并且又是从线性表的头部取出(删除),这种线性表称为队列。队列也用一维数组作为顺序存储空间,
又称为先进先出(FIFO-First In First Out)
允许插入的一端称为队尾,通常用一个尾指针(rear)的指针指向队尾元素;允许删除的一端称为排头(也称为队头),通常一个排头指针(front)指向排头元素的前一个位置。
队列运算:往队列的队尾插入一个元素称为入队运算,从队列的排头删除一个元素称为退队运算。
线性表存储的优缺点:
1、查找速度快,用一维数组做底层的数据结构,查找某个元素只需根据数组下标到对应的存储空间地址去取,方便快捷。
2、对经常做插入、删除元素大的线性表,运算效率比较低,这两种操作都涉及到数组中元素移动。
3、线性表扩容不方便,如果原线性表的存储空间后找不到与之连续的可用空间,则会导致运算失败或中断。
链式存储:要求每个节点由两部分组成,一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。指针用于指向该结点的前一个或后一个结点。
在链式存储结构特点:
1、存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系也可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
2、链式存储方式既可以用于表示线性结构,也可用于表示非线性结构。
线性表的链式存储结构称为线性链表。
在线性链表中,将一个元素的存储结点分为两部分:一部分用于存储数据元素的值,称为数据域;另一部分用于存放下一个元素的存储序号(即存储结点的地址),指向后件结点,称为指针域。
一般来说,线性链表中各数据结点的存储序号是不连续的,并且各个结点在存储空间中的位置关系与逻辑关系也不一致。各数据
元素之间的前后件关系是由各个结点的指针来指示,指向线性表中第一个结点的指针HEAD称为头指针,当HEAD=null(或0)时称为空表。
线性单向表:对于每个结点只有一个指针域,由这个指针只能找到后件结点,但不能找到前件结点的线性链表称为线性单向表。
双向链表:线性链表中的每个结点设置两个指针,一个称为左指针(Llink),用以指向其前件结点;另一个称为右指针(Rlink),用以指向其后件结点,这样的线性链表称为双向链表。
栈是线性表,也可以采用链式存储。带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。
队列也是线性表,也可以采用链式存储结构。
线性链表的运算主要有以下几种运算:
1)在线性链表中包含指定元素的结点之前插入一个新元素;
2)在线性链表中删除包含指定元素的结点;
3)将两个线性链表按要求合并成一个线性链表;
4)将一个线性链表按要求进行分解;
5)逆转线性链表;
6)复制线性链表;
7)线性链表排序;
8)线性链表的查找。
循环链表:
1、循环链表中加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素结点。
2、循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有的指针构成了一个环状链。