◆4.10③ 编写对串求逆的递推算法。
要求实现以下函数:
void Reverse(StringType &s);
StringType是串的一个抽象数据类型,它包含以下6种基本操作:
void InitStr(StringType &s);
// 初始化s为空串。
void StrAssign(StringType &t, StringType s);
//
将s的值赋给t。s的实际参数是串变量。
int StrCompare(StringType s, StringType t);
//
比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。
int StrLength(StringType s);
//
返回s中的元素个数,即该串的长度。
StringType Concat(StringType &s, StringType
t);
// 返回由s和t联接而成的新串。
StringType SubString(StringType s, int start, int len);
//
当1<=start<=StrLength(s)且0<=len<=StrLength(s)-
start+1时,
//
返回s中第start个字符起长度为len的子串,否则返回空串。
// 注意,不要使用 " s = "
的形式为 StringType 类型的变量赋值 ,
// 而要使用 StrAssign 函数!!!
void Reverse(StringType
&s)
{ StringType r;
StringType c;
int i;
InitStr(r);
InitStr(c);
for(i=
StrLength(s);i>=1;i--)
{
StrAssign(c,SubString(s,i,1));
Concat(r,c );
}
StrAssign(s,r);
}
◆4.12③ 编写一个实现串的置换操作Replace(&S,T,V)的算法。
要求实现以下函数:
void Replace(StringType &S, StringType T,
StringType V);
StringType是串的一个抽象数据类型,它包含以下6种基本操作:
void InitStr(StringType &s);
// 初始化s为空串。
void StrAssign(StringType &t, StringType s);
//
将s的值赋给t。s的实际参数是串变量。
int StrCompare(StringType s, StringType t);
//
比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。
int StrLength(StringType s);
//
返回s中的元素个数,即该串的长度。
StringType Concat(StringType &s, StringType
t);
// 返回由s和t联接而成的新串。
StringType SubString(StringType s, int start, int len);
//
当1<=start<=StrLength(s)且0<=len<=StrLength(s)-
start+1时,
//
返回s中第start个字符起长度为len的子串,否则返回空串。
// 注意,不要使用 " s = "
的形式为 StringType 类型的变量赋值 ,
// 而要使用 StrAssign 函数!!!
void Replace(StringType
&S, StringType T, StringType V)
{ StringType start;
StringType tail;
int i;
for(i=1;i<=StrLength(S)-StrLength(T)+1;i++)
if(!StrCompare(SubString(S,i,StrLength(T)),T))
{
StrAssign(start,SubString(S,1,i-1));
StrAssign(tail,SubString(S,StrLength(T)+i,StrLength(S)-StrLength(T)-i+1));
Concat(start,V);
StrAssign(S,start);
Concat(S,tail);
i-=1;
}
}
◆4.13③ 编写算法,从串s中删除所有和串t相同的子串。
要求实现以下函数:
void DelSubString(StringType &scrStr, StringType
subStr);
StringType是串的一个抽象数据类型,它包含以下6种基本操作:
void InitStr(StringType &s);
// 初始化s为空串。
void StrAssign(StringType &t, StringType s);
//
将s的值赋给t。s的实际参数是串变量。
int StrCompare(StringType s, StringType t);
//
比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。
int StrLength(StringType s);
//
返回s中的元素个数,即该串的长度。
StringType Concat(StringType &s, StringType
t);
// 返回由s和t联接而成的新串。
StringType SubString(StringType s, int start, int len);
//
当1<=start<=StrLength(s)且0<=len<=StrLength(s)-
start+1时,
//
返回s中第start个字符起长度为len的子串,否则返回空串。
// 注意,不要使用 " s = "
的形式为 StringType 类型的变量赋值 ,
// 而要使用 StrAssign 函数!!!
void DelSubString(StringType
&scrStr, StringType subStr)
{int i,a,b;
a=StrLength(scrStr);
b=StrLength(subStr);
StringType h;
StringType t;
InitStr(h);
InitStr(t);
for(i=1;i<=a-b+1;i++)
if(! StrCompare( SubString (scrStr,i,b),subStr))
{
StrAssign(h,SubString(scrStr,1,i-1));
StrAssign(t,SubString(scrStr,i+b,a-b+1-i));
Concat(h,t);
StrAssign (scrStr,h);
i--;
}
}
◆4.17③ 编写算法,实现串的基本操作Replace(&S,T,V)。
要求采用教科书4.2.1节中所定义的定长顺序存储表示,
但不允许调用串的基本操作。
要求实现以下函数:
Status Replace(SString& s, SString t, SString
v);
定长顺序串SString的类型定义:
typedef unsigned char
SString[MAXSTRLEN+1];
Status Replace(SString& s,
SString t, SString v)
{ int i,j,k,l;
if(!s[0])return FALSE;
for(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])
{
if(t[0]==v[0])
for(l=1;l<=t[0];l++)
s[i+l-1]=v[l];
else if(t[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];
}//if
}//for
return TRUE;
}
◆4.20③ 编写算法,从串s中删除所有和串t相同的子串。
要求实现以下函数:
Status DelSub(SString &s, SString t);
定长顺序串SString的类型定义:
typedef unsigned char SString[MAXSTRLEN+1];
Status DelSub(SString &s,
SString t)
{int i,j,k,n=1,tag;
if(!s[0])return FALSE;
if(s==t){s[0]=0;return TRUE;}
while(n<=s[0]){
i=1;j=1;
while(i<=s[0]&&j<=t[0]){
if(s[i]==t[j]){++i;++j;}
else{i=i-j+2;j=1;}}
if(j==t[0]+1){
for(k=i;k<=s[0];k++)s[k-t[0]]=s[k];
s[0]-=t[0];tag=1;}n++;}
if(tag)return TRUE;
if(!tag)return FALSE;
}
◆4.26③
采用教科书4.2.2节中所定义的堆分配存储
表示。试写一算法,实现堆存储结构的串的插入操
作StrInsert(&S,pos,T)。
要求实现以下函数:
Status StrInsert(HString &S, int pos, HString
T);
堆串HString的类型定义:
typedef struct {
char
*ch; //
若是非空串,则按串长分配存储区,否则ch为NULL
int length; // 串长度
} HString;
Status StrInsert(HString
&S, int pos, HString
T)
{ int m,k;
if(pos<1||pos>S.length+1)return
ERROR;
if(T.length){
if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
exit(OVERFLOW);
for(m=S.length-1;m>=pos-1;m--)S.ch[m+T.length]=S.ch[m];
for(k=pos-1;k<=pos+T.length-2;k++)S.ch[k]=T.ch[k-pos+1];
S.length+=T.length; }
return OK;
}
◆4.30⑤
假设以定长顺序存储结构表示串,试设计
一个算法,求串s中出现的第一个最长重复子串及
其位置,并分析你的算法的时间复杂度。
要求实现以下函数:
void CommonStr(SString s, SString &sub, int
&loc);
定长顺序串SString的类型定义:
typedef unsigned char
SString[MAXSTRLEN+1];
void
CommonStr(SString s, SString &sub, int
&loc)
{int i,j,k,max,a,b;
for(max=0,i=1;i
{
for(k=0,j=1;j<=s[ 0 ]-i;j++)
{ if(s[j]==s[j+i]) k++;
else k=0;
if(k>max)
{loc=j-k+1;max=k;}
}
}
a=1;b=loc;
while(a<=max)
{sub[a]=s[b];a++;b++;}
sub[0]=max;
}