具体操作如下:
1.定义串:
typedef struct
{
char data[Maxsize];
int length;
} SqString;
2.输入串:
void StrAssign(SqString &s,char cstr[])
{
int i;
for(i=0; cstr[i]!='\0'; i++)
s.data[i]=cstr[i];
s.length=i;
}
3. 串的复制
void StrCopy(SqString &s,SqString t)
{
for(int i=0; i<t.length; i++)
s.data[i]=t.data[i];
s.length=t.length;
}
4. 判断两个顺序串s和t是否相等
bool StrEqual(SqString s,SqString t)
{
bool same=true;
if(s.length!=t.length)
same=false;
else
for(int i=0; i<s.length; i++)
if(s.data[i]!=t.data[i])
{
same=false;
break;
}
return same;
}
5.求串长 返回顺序串s的长度
int StrLength(SqString s)
{
return s.length;
}
6.串的链接 返回由两个顺序串s和t链接在一起形成的结果串
SqString Concat(SqString s,SqString t)
{
SqString str;
str.length=s.length+t.length;
for(int i=0; i<s.length; i++)
str.data[i]=s.data[i];
for(int i=0; i<t.length; i++)
str.data[s.length++]=t.data[i];
return str;
}
7. 求子串 返回子串
SqString SubStr(SqString s,int i,int j)
{
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||j<0||i+j-1>s.length)
return str;
for(k=i-1; k<i+j-1; k++)
str.data[k-i+1]=s.data[k];
str.length=j;
return str;
}
8. 子串的插入 将顺序串s2插入到顺序串s1的第i个位置上,并返回产生的结果
SqString SubStr(SqString s1,int i,SqString s2)
{
int j;
SqString str;
str.length=0;
if(i<=0||i>=s1.length+1)
return str;
for(j=0; j<i-1; j++)
str.data[j]=s1.data[j];
for(j=0; j<s2.length; j++)
str.data[i+j-1]=s2.data[j];
for(j=i-1; j<s1.length; j++)
str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
return str;
}
9. 子串的删除 在顺序串s中删除从第i个字符开始的长度为j的子串,返回产生的结果
SqString DelStr(SqString s,int i,int j)
{
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j>s.length+1)
return str;
for(int k=0; k<i-1; k++)
str.data[k]=s.data[k];
for(int k=i+j-1; k<s.length; k++)
str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
10 子串的替换 在在顺序串中将第i个字符开始的连续j个字符够成的子串用顺序串t替换
返回产生的结果
SqString RepStr(SqString s,int i,int j,SqString t)
{
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j-1>s.length)
return str;
for(int k=0; k<i-1; k++)
str.data[k]=s.data[k];
for(int k=0; k<t.length; k++)
str.data[i+k-1]=t.data[k];
for(int k=i+j-1; k<s.length; k++)
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
11. 输出串 输出顺序串s
void DisStr(SqString s)
{
if(s.length>0)
{
for(int i=0; i<s.length; i++)
printf("%c",s.data[i]);
printf("\n");
}
}
具体例题:
串采用顺序存储,设计一个算法Strcmp(s,t)按字典序比较两个串s和t的大小
解题思路:
(1)比较s和t两个串共同长度范围内的字符
若s的字符大于t的字符,返回1;若s的字符小于t的字符,返回-1;若s的字符等于t的字符,按上述规则继续比较;
当(1)中的对应字符均相等时比较s和t的长度
s的长度大于t的长度,返回1;s的长度小于t的长度,返回-1;
int Strcmp(SqString s,SqString t)
{
int i,comlen;
if(s.length<t.length)
comlen=s.length;
else
comlen=t.length;
for(i=0; i<comlen; i++)
{
if(s.data[i]>t.data[i])
return 1;
else if(s.data[i]<t.data[i])
return -1;
if(s.length==t.length)
return 0;
else if(s.length>t.length)
return 1;
else
return -1;
}
}