live long and prosper
数据结构之顺序串
本篇博客为笔者在学习数据结构的顺序串时的学习笔记
串是由零个或者多个字符组成的有限序列。没有字符的字符串称为空串。串中所含字符的个数称为串的长度。
·两个串相等:指两个串的长度相同并且对应位置上的字符也相同。
·字串:一个串中的任意字符组成的新的串称为子串。
使用顺序存储结构的串称为顺序串
顺序串中的依次存放在一组连续的存储空间里,计算机内存以以子为存储单位。顺序串的存储方式有两种:
格式名 | 解释 | 特点 |
---|---|---|
非禁缩模式 | 一个子中存储一个字符 | 存储密度小 |
紧缩模式 | 一个子中存储多个字符 | 存储密度大 |
下面只讨论非紧缩模式下的顺序串:
1、声明顺序串
typedef struct
{
char data[MaxSize];
int length;
}SqString;
字符串数组用于存储字符,length则做为字符串的长度。
2、生成串
void StrAssign(SqString& s,char cstr[])
{
int i;
for(i=0;cstr[i]!='\n';i++)
{
s->data[i]=cstr[i];
}
s->length=i;
}
字符串cstr要赋给顺序串s,并且cstr要以’\n’结尾。
3、销毁串
void SqDestroy(SqString&s)
{
}
因为顺序串的存储空间有操作系统控制,当其超出作用域是自动清空,所以销毁操作为空
4、串的复制
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;
}
5、判断串相等
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= true;
else
same= false;
}
return same;
}
6、求串长
int StrLength(SqString s)
{
return s.length;
}
7、连接顺序串
SqString concat(SqString s,SqString t)
{
SqString str;
str.length=0;
str.length=s.length+t.length;
int i;
for(i=0;i<s.length;i++)
{
str.data[i]=s.data[i];
}
for(int j=0;j<t.length;j++)
{
str.data[s.length+j]=t.data[j];
}
return str;
}
8、求出子串
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;
}
9、插入字串
SqString InStr(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<s2.length;j++)
{
str.data[s2.length+j]=s1.data[j];
}
return str;
}
10、删除字串
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;
}
11、替换字串
SqString RepStr(SqString s,int i,int j,SqString t) //子串替换
{
int k;
SqString str;
str.length=0;
if (i<=0 || i>s.length || i+j-1>s.length) //参数不正确时返回空串
return str;
for (k=0;k<i-1;k++) //将s.data[0..i-2]复制到str
str.data[k]=s.data[k];
for (k=0;k<t.length;k++) //将t.data[0..t.length-1]复制到str
str.data[i+k-1]=t.data[k];
for (k=i+j-1;k<s.length;k++) //将s.data[i+j-1..s.length-1]复制到str
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
12、输出串
void DispStr(SqString s) //输出串s
{
int i;
if (s.length>0)
{ for (i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
欢迎斧正