对数据结构已经能够做到自己实现的人可以接下来去考虑数据结构的特性和应用了
线性表:是一种可以在任意位置进行插入和删除数据元素操作的,由n(n>=0)个相同类型数据元素a0,a1,a2,...,an-1组成的线性结构
(1)顺序存储结构:
效率分析:顺序表上的插入和删除是顺序表中时间复杂度最高的成员函数。(有顺序的插入所以需要比较,无顺序的插入不予考虑)
n/2 n/2
插入和删除的时间复杂度是O(n)而其余操作的时间复杂的为O(1)
优点:算法简单,空间单元利用效率高
缺点:预先确定数据元素的最大个数,并且插入和删除操作时需要移动较多的数据元素
(2)链式存储结构:
效率分析:单链表上的插入和删除操作的时间效率分析与顺序表类同,但是单链表不用移动元素,所以当数据元素占据内存大的时候单链表的插入和删除操作要比顺序表少一个常数倍 n/2 (n-1)/2
插入和删除的时间复杂度是O(n),求单链表的长度的时间复杂度也是O(n)
优点:不需要预先确定数据元素的最大个数,插入和删除操作时不需要移动数据元素
缺点:每个结点中要有一个指针域,因此空间的利用效率不高,而且单链表操作的算法较为复杂。
堆栈:只允许在固定的一段进行插入和删除操作,允许插入和删除的一端叫做栈顶,另一端称为栈底
栈也是一种线性表,所以有顺序堆栈和链式堆栈
应用范围:(1)括号匹配问题
(2)中缀表达式写成相应的后缀表达式
队列:只允许在其一端进行插入操作其另外一端进行删除操作
队列也是一种线性表。
假溢出:因为只能够队头出(front出)队尾入(rear入),所以可能出现这样的情况,先入一些元素,出部分元素,再入一些元素,发现尾指针指到最后了但是前方因为头指针的出还有空位,所以此时有存储空间但不能进入队列操作的溢出称为假溢出
所以一般采用顺序循环队列的方式,这也是软件设计中使用率最高的一种方式。
采用循环队列判断队满的方式:
(1)加一个标识位,表示这是第一次进入,还是第二次front==rear
(2)少用一个存储单元,(rear+1)%MaxQueueSize==front
(3)r增加一个计数器count>0&&rear==front
串:由n个字符组成的有限序列
==串还是一种特殊的线性表,所以你看线性表是多么的重要啊
串也有顺序存储结构和链式存储结构两种
块链:每个结点的数据域包括若干个字符。
(KMP算法还是要好好注意的,这个我到时候再写一篇如果之前没写过的话。。。记性不好了)
数组:数组是n(n>1)个相同数据类型的数据元素a0,a1,a2,...,an-1构成的占用一块地址连续的内存单元的有限序列。
是一种随机存储结构
数组和线性表的不同之处:
(1)数组要求其元素占用一块地址连续的内存单元空间,而线性表无此要求
(2)线性表的元素是逻辑意义上不可再分的元素,而数组中的每个元素还可以是一个数组。
(3)数组的操作主要是向某个下标的数组元素中存数据和取某个下标的数组元素,这与线性表的插入,删除操作不同。
三元组的概念:三个数据域,行,列,数据,一个指针域