计算机中对非数值处理基本上为字符串数据,对于字符串的处理要比数值处理难度大,因而更为重要!
串的定义、长度、相等等就不提啦。对串的最小操作集是:
1、串赋值:StrAssgin
2、串比较:StrCompare
3、求串长:StrLength
4、串联接:Concat
5、求字串:SubString
其他操作均可以在以上操作集上实现,例如利用判等、求子串和求串长等即可实现定位函数Index(S,T,pos),算法的基本思想就是:在主串中取从第i(i的初值为pos)个字符起、长度和串T相等的子串和T相比较,相等则说明i即为所求,返回;否则增加i,直至串S中不存在和串T相等的子串为止!
串的表示及实现:
1、定长顺序存储表示
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存储字符串的长度
Ps: 下标为0的数组分量存储字符串的长度;串值的后面并没有表示结束的‘\0’,因此显然利于某些串的操作
2、堆分配存储表示
type struct{
char *ch; //若非空,则按串长分配存储区,否则ch为NULL
int length;//串的长度
}HString;
下面是基于堆分配存储表示的基本操作函数的实现:
Status StrAssign(Hstring &T, char *chars)
{
//生成值等于串常量的串T
if(T.ch) free(T.ch);
for(i=0, c = chars; c; ++i, ++c) ;
if( ! i ) { T.ch = NULL; T.length = 0;}
else
{
if( !( T.ch = (char *)malloc(i * sizeof(char)))) exit(OVERFLOW);
T.length = i;
for( ; i > 0; i--) T.ch[i] = chars[i];
}
return OK;
}//StrAssign
itn Strlength(HString S)
{
//返回S的元素个数,即串的长度
return S.length;
}//StrLength
int StrCompare(HString S, HString T)
{
//若S > T,则返回值大于零;若S = T,则返回值为零;否则小于零
int i;
for( i = 0; i < S.length && i < T.length; ++i)
{
if( S.ch[i] != T.ch[i]) return S.ch[i] - T.ch[i];
}
return S.length - T.length;
}//StrCompare
Status ClearString(HString &S)
{
//将S清空
if(S.ch) { free(S.ch); S.ch = NULL;}
S.lenght = 0;
return OK;
}//ClearString
Status Concat(HString &T, HString S1, HString S2)
{
//用T返回由串S1和S2联接而成的新串
int i;
if( ! T.ch) free(T.ch); //将原来的空间释放
if( ! (T.ch = (char *)malloc((S1.length + S2.length)*sizeof(char)))) exit(OVERFLOW);
for(i = 0; i < S1.length-1; i++) T.ch[i] = S1.ch[i];
T.length = S1.length + S2.length;
for( ; i < T.length-1; i++) T.ch[i] = S2.ch[i - S1.length + 1];
return OK;
}//Concat
Status SubString(HString &Sub, HString S, int pos, int len)
{
//用Sub返回串S的第pos个字符起,长度为len的子串
//其中1<=pos<=S.length且0<=len<=S.length -pos +1
int i;
if(pos < 1 || pos > S.length || len < 0 ||len > S.length - pos +1) return ERROR;
if (Sub.ch) free(Sub.ch); //释放久空间
if (! len) {Sub.ch = NULL; Sub.length = 0;} //空串
else
{
Sub.ch = (char *)malloc(len * sizeof(char));
for( i = 0; i < len; i++) Sub.ch[i] = S.ch[pos + i - 1];
Sub.length = len;
}
return OK;
}//SubString
以上即串操作基于堆分配存储的基本操作,串的存储还有另外一种表示方式,即串的块链存储表示!由于其操作比较复杂,我也是刚接触数据结构,在此不再引出。对于串还有比较重要的匹配模式算法:
int Index(SStinrg S, SString T, int pos)
{
//返回子串T在主串S中的位置,用pos返回第一个字符的位置
//其中,T非空,且1 <= pos<=Strlength(S)
i = pos;
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]) return i - T[0];
else return 0;
}//Index
以上就是本文所讲的内容了,希望大家批评指正,这也是第一次发博文,还望各位大侠不吝赐教!
(文基本操作出自我们正在学习的课本,这是第二遍看时的笔记)