我们都知道数据结构是学习计算机的重要部分,理解起来也很困难,那么我将总结几篇数据结构主要的内容给大家复习,个别困难的内容会单独出专题解释,让大家更好的理解。
那么我们就先从线性结构开始
线性表
线性表是线性结构(每个元素最多只有一个出度和一个入度,表现为一条线状)的代表,线性表按存储方式分为顺序表和链表,存储形式例图:
上图中,顺序表是需要一段连续的内存空间来存放顺序表中的所有元素,这些元素在物理地址上是相邻的。
而链表中的所有元素只是逻辑上相邻,在实际物理存储时处于不同的空闲块中,元素之间通过指针域连接,如上图所示,又可分为单链表、循环链表、双向链表,具体逻辑上的关系都如上图所示
单链表的删除和插入
在上图中p所指向的节点后插入 S 所指向的节点,操作为:
s-next=p->next;
p->next=s.
同理,在单链表中删除 p 所指向节点的后继节点 q 时,操作为:
q=p->next;
p->next=p->next->next;
free(p).
双向链表的插入和删除
如上图所示,插入步骤为:
(1) s -> front = p -> front;
(2)p->front->next=s;,或者表示为s->font->next=s;
(3)s->next=p;
(4)p -> front= s;
删除节点步骤为:
(1) p -> front -> next = p -> next;(2) p -> next -> front = p -> front; free(p):
那么顺序存储和链式存储有什么大的区别呢?
首先是存储密度,顺序存储=1,更优,链式存储因为含有指针所以密度<1。
接下来是容量分配,顺序存储是事先确定的,链式存储是动态改变的,更优。
然后是查找运算两者一样都是O(n/2)。
再然后是读运算顺序存储为O(1),链式存储是O([n+1]/2),最好情况是1,最坏情况是n。
当然还有插入运算和删除运算,链式存储表现更优。
当需要对元素进行不改变结构操作时(读取、查找,顺序表效率更高,因为其物理地址是连续的,如同数组一般,只需按索引号就可快速定位,而链表需要从头节点开始,一个个的查找下去。
接下来我们讨论栈与队列
对于栈与队列我们知道队列是先进先出的,然而栈是先进后出的,只有栈顶能进出。
这么说大家不直观,大家可以对着下面的图进行理解。
其次还有个循环队列:
在循环队列中,头指针指向第一个元素,尾指针指向最后一个元素的下一个位置,因此,当队列空head=tail,当队列满时,head=tail,这样就无法区分了,因此,一般将队列少存一个元素,这样,时,队列满时的条件就变为 tail+1=head,而考虑是循环队列,必须要除以最大元素数来取余数,即(tail+1)%size=head,如上图右边所示两个公式。循环队列的长度公式为(Qtail-Qhead)%size。
优先队列:元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。使用堆来存储.
因为其不是按照元素进队列的顺序来决定的。
栈与队列讲完了还有串呢!
我们知道串只是个简称,它可以是字符串,空串,空格串,子串等;
其中:
字符串是一种特殊的线性表,其数据元素都为字符。
空串:长度为0的字符串,没有任何字符。
空格串:由一个或多个空格组成的串。
子串:串中任意长度的连续字符构成的序列称为子串。
子串可以进行定位操作:
子串定位操作用于查找子串在主串中第一次出现的位置算法。
模式匹配算法
基本的模式匹配算法:也称为布鲁特一福斯算法,其基本思想是从主串的第 1个字符起与模式串的第1个字符比较,若相等,则继续逐个字符进行后续的比较。否则从主串中的第2个字符起与模式串的第 1个字符重新比较,直至模式串中每个字符依次和主串中的一个连续的字符序列相等时为止,此时称为匹配成功,否则称为匹配失败。
KMP 算法:对基本模式匹配算法的改进,其改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回溯主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。
好了,那么到目前为止我们线性结构的大概内容就总结完了,下一篇文章我会向大家介绍数组,矩阵的内容。大家可以关注一下,以便更方便找到文章。敬请期待之后的内容。