抽象数据类型
ADT String
{
数据对象:
D={ai | 1<=i<=n,n>=0,ai为char类型}
数据关系:
R={<ai,ai+1} | ai、ai+1 属于 D, i=1, ... ,n-1}
基本运算:
StrAssign(&s,cstr):将字符串常量cstr赋给串s,即生成值为cstr的串s
DestroyStr(&s):销毁串,释放为串s分配的存储空间
StrCopy(&s,t):串复制,串t赋给串s
StrEqual(s,t):判串是否相等
StrLength(s):求串长
Concat(s,t):串连接
SubStr(s,i,j):求子串,返回s中从i开始的连续j个字符
InsStr(s1,i,s2):子串插入,s2插入s1的第i个位置
DelStr(s,i,j):子串删除,从s的第i个位置起删去连续j个字符
RepStr(s,i,j,t):子串替换,从s的第i个位置起的连续j个字符替换成串t
DispStr(s):串输出
}
顺序串
数据声明
typedef struct{
char data[MaxSize];
int length;
}SqString;
生成串
void StrAssign(SqString &s,char cstr[])
{
int i;
for (i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
销毁串
void DestroyStr(SqString &s)
{ }
串的复制
void StrCopy(SqString &s,SqString t)
{
int i;
for(i=0;i<t.length;i++)
s.data[i]=t.data[i];
s.length=t.length;
}
串相等
bool StrEqual(SqString s,SqString t)
{
bool same = true;
int i;
if(s.length!=t.length)
same=false;
else
for(i=0;i<s.length;i++)
if(s.data[i]!=t.data[i])
{
same=false;
break;
}
return same;
}
求串长
int StrLength(SqString s)
{
return s.length;
}
串连接
SqString concat(SqString s,SqString t)
{
SqString str;
int i;
str.length=s.length + t.length;
for(i=0;i<s.length;i++)
str.data[i]=s.data[i];
for(i=0;i<t.length;i++)
str.data[s.length+i]=t.data[i];
return str;
}
求子串
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];
s.length = j;
return str;
}
插入子串
SqString InsStr(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;
}
删除子串
SqString DelStr(SqString s,int i,int j)
{
int k;
SqString str;
str.length=0;
if(i<=0 || i>s.length || i+j>s.length+1)
return str;
for(k=0;k<i-1;k++)
str.data[k] = s.data[k]
for(k=i+j-1;k<s.length;k++)
str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
替换子串
SqString RepStr(SqString s,int i,int j,SqString t)
{
int k;
SqString str;
if(i<0 || i>s.length || i+j-1>s.length)
return str;
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=0;k<t.length;k++)
str.data[i-k+1]=t.data[k];
for(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;
}
输出串
void DispStr(SqString s)
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
cout<<s.data[i];
cout<<endl;
}
}
实现StrCmp
--此处先比较字典序 , 再比较长度
s.length > t.length || s > t 返回1
s.length < t.length || 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;
}