1、 连接两个顺序串的算法
已知顺序串St1St2,把St2连接到St1的末尾,得到一个新的顺序串St3。算法名为Concat_St(),参数为St1St2
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判断两个顺序串相等的算法。
    已知顺序串St1St2,如果相等则返回1,否则返回0。算法名为Equal_St(),参数为St1St2
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(),参数为St1In
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))    /* in正确 */
  {
    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(),参数为St1St2i
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(),参数为Stim
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,子串的长度是mn>>m。模式匹配的基本思想是,用模式St2中的每一个字符去与正文St1中的字符做比较。
已知主串St1和子串St2,寻求子串St2在主串St1中首次出现的起始位置。算法名为Index_St(),参数为St1St2
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(),参数为St1St2x
{
    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(),参数为St1St2St3
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小时内删除。