串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符,哪怕串中的字符是“123”这样的数字组成,
或者“2010-10-1CT这 样的日期组成,它们都只能理解为长度为3和长度为10的字符串,每个元素都是字符而已。
因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如査找一个元素,插入或删除一个元素,但串中更多
的是査找子串位置、得到指定位置子串、替换子串等操作。
ADT 串(string) Data 串中元素仅由一个字符组成,相邻元素具有前驱后继的关系。 Operation StrAssign(T,*chars):生成一个其值等于字符串常量chars的串。 StrCopy(T,S):串S存在,由串S复制得串T。 ClearString(S):串S存在,将串清空。 StringEmpty(S):若串S为空,返回true,否则返回false StrCompare(S, T):串S和T存在,若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0。 StrLength(S):串S存在,返回S的元素个数,称为串的长度。 ClearString (&S):串S存在,将S清为空串。 Concat (&T, S1, S2):串S1和S2存在,用T返回由S1和S2联接而成的新串。 SubString(&Sub, S, pos, len):串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1,用Sub返回串S的第pos个字符长度为len的子串。 Index(S, T, pos):串S和T存在,T是非空串,1≤pos≤StrLength(S),若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。 Replace (&S, T, V):串S, T和V存在,T是非空串,用V替换主串S中出现的所有与T相等的不重叠的子串。 StrInsert (&S, pos, T)串S和T存在, 1≤pos≤StrLength(S)+1,在串S的第pos个字符之前插入串T。 StrDelete (&S, pos, len):串S存在, 1≤pos≤StrLength(S)-len+1,从串S中删除第pos个字符起长度为len的子串。 DestroyString (&S):串S存在,串S被销毁。
endADT
串的顺序存储结构
串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。
一般是用定长数组来定义。
但是顺序存储方式其实是有问题的,因为字符串的操作,比如两串的连接Concat、新串的插入Strlnsert、以及字符串的替换Replace,都有可能使
得串序列的长度超过了数组的长度MaxSize。
于是对于串的顺序存储,有一些变化,串值的存储空间可在程序执行过程中动态分配而得。比如在计算机中存在一个自由存储区,叫做“堆”。这个堆
可由C语言的动态分配函数malloc()和free()来管理。
串的链式存储结构
串的链式存储结构除了在连接串与串操作时有一定的方便外,总的来说不如顺序存储灵活,性能也不如顺序存储结构好。