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
{
字符串长度17模式串长度 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替换。算法名为Replace_St(),参数为St1、St2、St3。
Replace_St(St1, St2, St3)
{
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)&&());
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论