(二)队列:
1.队列:允许一端插入(队尾),另一端删除(队头);
先进先出FIFO;
2.ADT:
3.顺序存储——循环队列:
(1)引入两个指针front指向队头元素,rear指向队尾元素的后一个元素;则当f等于r时,是空队列;
(2)循环队列:头尾相接;
(3)满队列:空满判定一致,则规定队列满:数组中还有一个空闲;即(rear+1)%queuesize==front时,队列满;
(4)队列长度计算:(rear-front+queuesize)%queuesize;
(5)循环队列顺序存储:
(6)循环队列初始化:
(7)循环队列求长度:
(8)循环队列入队:队列不满;赋值给队尾;队尾指针rear后移;
(9)循环队列出队:队列不空;头元素赋值取出;front指针后移;
4.队列链式存储:
(1)链队列:只能尾进头出的单链表;
(2)头指针front:指向链队列头结点(队头元素的前一个元素);尾指针rear:指向终端结点(队尾元素);
(3)空队列:front,rear都指向头结点;
(4)链队列结构:结点链表;指向链表的指针front,rear;
(5)链队列入队:
新建结点(队列不会满,只用判断分配内存成功与否);新结点赋值,指向NULL;原队尾元素指向新结点;队尾指针指向新结点;
(6)链队列出队:
队列不空;将欲删除的结点用p暂存;数据返回;让头结点指针(front)指向删除结点的后结点;判断,若此时尾指针也指向p,则队头队尾重合,则删除后将rear指向头结点;
5.在可以确定队列最大长度的情况下,建议循环队列;
五、串:
1.串/字符串:零个/多个字符组成的有限序列;
2.s=”a1a2a3…an”;n为字符长度(0个字符的串称为空串,“”);
空格串:只包含空格的串;
子串与主串:任意个数连续字符组成子序列为子串;
3.串的比较:通过组成字符之间的编码(字符在对应字符集的序号)进行;
(1)相等:长度和对应字符都相等;
(2)不等:逐个字符比较;
4.ADT:
5.串的存储模式:
(1)顺序存储:地址连续存储单元(一般用定长数组);
a.可将长度存在0下标位中;
b.可在末位加/0,遍历得知串长;
(2)链式存储:可以一个结点存多个字符;
6.朴素模式匹配算法:串的定位操作(模式匹配)
(1)对主串每一个字符作为子串开头与要匹配字符串匹配;对主串做大循环,每个开头作要匹配串长度的小循环,直到匹配成功或遍历完毕;
(2)Index:S中存在和T相等的子串,则返回第一个元素的位置;
a.串S,T,长度存储在首位;i定位主串,j定位子串;
b.i小于S的长度且j小于T长度时循环比较;当元素Si和Tj相等时,后移比较;
c.当后移到不能匹配了,跳出小循环,让S串回到刚刚比较位置的下一位(i-j+1),让T串回到首位(1);
d.当j大于T串长度时,跳出大循环;说明匹配成功,子串在S中位置为(i-T0);
e.否则匹配失败,返回0;
7.KMP模式匹配:
(1)构建next数组表示T串;字符个数由前后的相似度决定;
(2)next数组:
a.next[j] = 0 当j=1时
b.next[j] = 1 当j之前的字符串首尾没有匹配的字符时
c.next[j] =首尾的匹配数 +1 当j之前的字符串有首尾匹配的时候
d.举例:ababaaaba
011(a之前的ab不匹配)
0112(b之前的aba有1个元素匹配,则1+1=2)
01123(a之前的abab有2个匹配,1+2=3)
011234(a之前的ababa有3个匹配,1+3=4)
011234223
(3)KMP模式匹配算法实现:
a.返回next数组:j标记前缀,i标记后缀;
当前缀为0时,i、j同时自增,将前缀值1赋给后缀所在next2;
b.相当于此时有T和next,它们一一对应;若某个元素b的next为a则说明前后缀的a-1个元素已经匹配上了,此时如果要求下一个元素c的next,不需要从头比较,只需要比较b和下标为a的元素(前缀之前匹配了a-1,现在匹配a)即可;
如果相等则等于上一个next+1;
不相等则前移,比较b的前一个元素和a-1位置的是否相等;
c.在程序中用j指向了前面的元素,用i指向了后面的元素;作自增比较;
相等时,得到i位置的next值为++j;
当不相等时,就回到上一个能前缀匹配的位置(即j=next[j]);
(以上为返回next数组)
a.程序不回溯i了;先依次对应匹配,当匹配不上时,把T数组移动到上一个匹配点(即前面的都能匹配上,只有这个元素不一样);直到前面的也能匹配上,这个元素也可以匹配上为止;
b.继续依次匹配,遍历完T后都一致则完成匹配;T在S中位置即为i现在的位置减去T的长度;
(4)KMP模式匹配改良:合并相同的字符:如果a位字符与它next值指向的b位字符相等,该a位的nextval就指向b位的nextval值,否则就是它自己的next;
(j=j[next]即前移到上一个匹配处,即后缀移动到前缀处,用于求next中适配;j[next]=j即前缀移动到后缀处,用于和主串比较时,通过回溯j减少比较;因为j[next]就是上一个能匹配的地方,即前缀处)