您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页数据结构第四章 串的算法概要

数据结构第四章 串的算法概要

来源:叨叨游戏网


1、 连接两个顺序串的算法

已知顺序串St1和St2,把St2连接到St1的末尾,得到一个新的顺序串St3。算法名为Concat_St(),参数为St1、St2。

Concat_St(St1, St2)

{

char St3[maxsize]; /* 创建一个新的顺序串为空 */

St3_len=0;

if (St1_len+St2_len>maxsize+1) /* 新串放不下两个串 */

{

printf(\"两串长度之和超长!\");

return(NULL);

}

else

{

for (i=1; i<=St1_len; i++) /* 把串St1传送给串St3 */

St3[i]=St1[i];

for (j=1; j<=St2_len; j++) /* 接着把St2传送给串St3 */

St3[j+St1_len]=St2[j];

St3_Len=St1_len+St2_len; /* 修改串St3的长度 */

St3[St3_len+1]= \"\\0\"; /* 为St3安放串结束符 */

return(St3); /* 返回St3 */

}

}

2、判断两个顺序串相等的算法。

已知顺序串St1和St2,如果相等则返回1,否则返回0。算法名为Equal_St(),参数为St1、St2。

Equal_St(St1, St2)

{

if (St1_len != St2_len) /* 两个串长度不相等 */

return (0);

else /* 两个串长度相等 */

{

for (i=1; i<=St1_len; i++)

if (St1[i] != St2[i]) /* 有字符不同 */

return (0);

return (1);

}

}

3、从主串指定位置处取出定长子串的算法。

已知主串St1,从第i个位置开始,把连续n个字符组成的子串赋给串St2。算法名为Sub_St(),参数为St1、I、n。

Sub_St(St1, i, n)

{

char St2[n+1];

St2_len = 0;

if ((i>=1) && (i<=St1_len) && (n>=1) && (n<=St1_len-i+1)) /* i和n正确 */

{

for (j=1; j<=n; j++)

St2[j] = St1[i+j-1];

St2_len = n;

St2[n+1]= \"\\0\";

}

else /* 参数不正确 */

{

printf (\"开始位置或子串长度错!\");

return (NULL);

}

return (St2);

}

4、把子串插入到主串指定位置的算法。

已知主串St1和串St2,从主串第i个位置往后插入串St2。算法名为Inssub_St(),参数为St1、St2、i。

Inssub_St(St1, St2, i)

{

if (St2_len == 0) /* 子串为空 */

{

printf (\"串St2 为空!\");

return (NULL);

}

else if(i<1 || i>St1_len+1) /* 所给位置参数不对 */

{

printf (\"插入位置错! \");

return (NULL);

}

else if(St1_len+St2_len>maxsize) /* 主串存储区太小 */

{

printf (\"插入后主串太长!\");

return (NULL);

}

else /* 参数正确,进行正常插入 */

{

for (k=St1_len; k=i; k--)

St1[k+1]=St1[k];

for (j=1; j<=St2_len; j++)

St1[i+j-1]=St2[j];

St1_len=St1_len+St2_len;

St1[St1_len+1]= \"\\0\";

}

}

5、把主串指定位置后的子串删除的算法。

已知主串St,要将从第i个字符开始的、连续m个字符删除。算法名为Delsub_St(),参数为St、i、m。

Delsub_St(St, i, m)

{

if (i>St_len)

{

printf (\"删除位置错!\");

return(NULL);

}

else if (i+m>St_len)

{

printf (\"删除子串超长!\");

return(NULL);

}

else /* 一切正常,删除长度为m的子串 */

{

j=i+m;

while (j<=St_len) /* 将St中从i+1到末尾的字符依次前移m个位置 */

{

St[j-m]=St[j];

j++;

}

St[j]= \"\\0\"; /* 设置串结束符 */

St_len=St_len-m; /* 修改主串长度 */

}

}

6、求子串在主串首次出现的匹配位置算法。

寻求子串St2在主串St1中首次出现的起始位置,称作为字符串的“模式匹配”,St2为“模式(Patten)”,St1称为“正文(Text)”。假定主串的长度是n,子串的长度是m,n>>m。模式匹配的基本思想是,用模式St2中的每一个字符去与正文St1中的字符做比较。

已知主串St1和子串St2,寻求子串St2在主串St1中首次出现的起始位置。算法名为Index_St(),参数为St1、St2。

Index_St(St1, St2)

{

i=1;

while (i<=St1_len-St2_len+1) /* 控制模式匹配进行的趟数 */

{

j=i;

k=1;

while ((k<=St2_len) && (St1[j] == St2[k])) /* 进行第i趟匹配 */

{

j++;

k++;

}

if (k > St2_len) /* 匹配成功,返回位置i */

return (i);

else

i++; /* 这一趟不匹配,进入下一趟匹配 */

}

return (-1); /* 整个匹配失败,返回−1 */

}

7、在主串指定位置后进行子串的匹配算法。

已知主串St1和子串St2,从指定位置x处开始寻求子串St2在主串St1中首次出现的起始位置。算法名为Indsub_St(),参数为St1、St2、x。

{

j=i;

k=1;

while ((k<=St2_len)&&(St1[j] == St2[k]))

{

j++;

k++;

}

if (k > St2_len)

return (i);

else

i++;

}

return (−1);

}

8、将主串中出现的所有子串用另一个子串替换的算法。

已知主串St1,在其中寻找出所有的子串St2,并用子串St3替换。算法名为,参数为St1、St2、St3。

Replace_St(St1, St2, St3)

{

Replace_St()

i=1;

do

{

x=Indsub_St(St1, St2, i); /* 从i起找与St2匹配的子串 */

if (x != -1) /* 找到 */

{

Delsub_St(St1, x, St2_len); /* 在主串中删除子串St2 */

Inssub_St(St1, St3, x); /* 在主串中插入子串St3 */

x=x+St3_len; /* 得到新的匹配位置 */

St1_len=St1_len-St2_len+St3_len; /* 修改主串的长度 */

i=x; /* 修改匹配开始位置 */

}

}while ((x>= St2_len+1)&&());

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务