前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构题集(严书)串 常见习题代码

数据结构题集(严书)串 常见习题代码

作者头像
glm233
发布2020-09-28 10:53:53
8030
发布2020-09-28 10:53:53
举报
文章被收录于专栏:glm的全栈学习之路

4.10编写对串求逆的递推算法。

代码语言:javascript
复制
void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r
{
  StrAssign(r,''); //初始化r为空串
  for(i=Strlen(s);i;i--)
  {
    StrAssign(c,SubString(s,i,1));
    StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中
  }
}//String_Reverse 

4.11编写算法,求得所有包含在串s中而不包含在串t中的字符(s中重复的字符只选一个)构成的新串r,以及r中每个字符在s中第一次出现的位置。

代码语言:javascript
复制
void String_Subtract(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r
{
  StrAssign(r,'');
  for(i=1;i<=Strlen(s);i++)
  {
    StrAssign(c,SubString(s,i,1));
    for(j=1;j<i&&StrCompare(c,SubString(s,j,1));j++); //判断s的当前字符c是否第一次出现
    if(i==j)
    {
      for(k=1;k<=Strlen(t)&&StrCompare(c,SubString(t,k,1));k++); //判断当前字符是否包含在t中
      if(k>Strlen(t)) StrAssign(r,Concat(r,c));
    }
  }//for
}//String_Subtract

4.12编写一个实现串的置换操作Replace(&S, T, V)的算法。

代码语言:javascript
复制
int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数
{
  for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //n为置换次数
    if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串
    { //分别把T的前面和后面部分保存为head和tail
      StrAssign(head,SubString(S,1,i-1));
      StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));
      StrAssign(S,Concat(head,V));
      StrAssign(S,Concat(S,tail)); //把head,V,tail连接为新串
      i+=Strlen(V); //当前指针跳到插入串以后,这里如果不加这条语句的话有可能会导致死循环(当被替换的字符串是替换的字符串的子串时)
      n++;
    }//if
  return n;
}//Replace

4.13编写算法,从串s中删除所有和串t相同的子串。

代码语言:javascript
复制
int Delete_SubString(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数
{
  for(n=0,i=1;i<=Strlen(s)-Strlen(t)+1;i++)
    if(!StrCompare(SubString(s,i,Strlen(t)),t))
    {
      StrAssign(head,SubString(S,1,i-1));
      StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));
      StrAssign(S,Concat(head,tail)); //把head,tail连接为新串
      n++;
    }//if
  return n,
}//Delete_SubString

4.14利用串的基本操作以及栈和集合的基本操作,编写“由一个算术表达式的前缀式求后缀式”的递推算法(假设前缀式不含语法错误)。

代码语言:javascript
复制
Status NiBoLan_to_BoLan(Stringtype str,Stringtype &new)//把前缀表达式str转换为后缀式new
{
  Initstack(s); //s的元素为Stringtype类型
  for(i=1;i<=Strlen(str);i++)
  {
    r=SubString(str,i,1);
    if(r为字母) push(s,r);
    else
    {
      if(StackEmpty(s)) return ERROR;
      pop(s,a);
      if(StackEmpty(s)) return ERROR;
      pop(s,b);
      StrAssign(t,Concat(r,b));
      StrAssign(c,Concat(t,a)); //把算符r,子前缀表达式a,b连接为新子前缀表达式c
      push(s,c);
    }
  }//for
  pop(s,new);
  if(!StackEmpty(s)) return ERROR;
  return OK;
}//NiBoLan_to_BoLan

4.17编写算法,实现串的基本操作Replace(&S, T, V)。

代码语言:javascript
复制
4.17 
int String_Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数
{
  for(n=0,i=1;i<=S[0]-T[0]+1;i++)//该类型下字符串下标为零位置存放字符串长度
  {
    for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++);
    if(k>T[0]) //找到了与T匹配的子串:分三种情况处理
    {
      if(T[0]==V[0])
        for(l=1;l<=T[0];l++) //新子串长度与原子串相同时:直接替换
          S[i+l-1]=V[l];
      else if(T[0]<V[0]) //新子串长度大于原子串时:先将后部右移
      {
        for(l=S[0];l>=i+T[0];l--)
          S[l+V[0]-T[0]]=S[l];
        for(l=1;l<=V[0];l++)
          S[i+l-1]=V[l];
      }
      else //新子串长度小于原子串时:先将后部左移
      {
        for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)
          S[l]=S[l-V[0]+T[0]];
        for(l=1;l<=V[0];l++)
          S[i+l-1]=V[l];
      }
      S[0]=S[0]-T[0]+V[0];
      i+=V[0];n++;
    }//if
  }//for
  return n;
}//String_Replace

4.24试写一算法,在串的堆存储结构上实现串基本操作Concat(&T, s1,s2)。

代码语言:javascript
复制
4.24 
void HString_Concat(HString s1,HString s2,HString &t)//将堆结构表示的串s1和s2连接为新串t
{
  if(t.ch) free(t.ch);
  t.ch=malloc((s1.length+s2.length)*sizeof(char)),t.length=s1.length+s2.length;;
  for(i=0;i<t.length;i++) i<s1.length?t.ch[i]=s1.ch[i]:t.ch[i]=s2.ch[i-s1.length];
}//HString_Concat 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档