串(String)--基本概念

概念

串(string)是由零个或多个字符组成的有限序列,又叫字符串。一般记为 s=” a1a2...an ”( n0 )。串中的字符数目n成为串的长度,有限。零个字符的串成为空串。

空格串:只包含空格的字符串,注意其与空串的区别,空格串有内容有长度。

子串和主串,串种任意个数的连续字符组成的子序列成为该主串的子串。子串在主串中的位置是子串的第一个字符在主串中的序号。

串的抽象数据类型

串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,串的每个元素都是字符。因此,串的基本操作和线性表有较大差距。线性表关注单个元素的操作,例如查找、插入和删除元素;但串种更多的是查找子串的位置、得到指定位置的子串、替换子串等操作。具体如下所示:

ADT 串(string)
Data
   串中元素仅由一个字符组成,相邻元素具有前驱和后继关系。
Operation
   StrAssign(T,*chars):生成一个值等于字符串常量chars的串T。
   StrCopy(T,S):串S存在,由串S复制得串T。
   ClearString(S):串S存在,将串S清空。
   StringEmpty(S):若串S为空,返回true,否则返回false。
   StrLength(S):返回串S的元素个数,即串的长度。
   StrCompare(S,T):若S>T,返回值>0;若S=T,返回0;若S<T,返回值<0。
   Concat(T,S1,S2):用T返回由S1和S2连接成的新串。
   SubString(Sub,S,pos,len):串S存在,下标pos大于等于1且小于等于S串长,子串长len大于等于0且小于等于串长+1-pos,用Sub返回串S的第pos个字符起长度为len的子串。
   Index(S,T,pos):串T和S存在,T为非空串,下标pos大于等于1且小于等于S串长。若主串S中存在和串T值相同的子串,则返回它在主串S中的第pos个字符之后第一次出现的位置,否则返回0。
   Replace(S,T,V):串S、T和V存在,T是非空串。用V替换主串S中出现的所有与T相等的不重叠的子串。
   StrInsert(S,pos,T):串S和T存在,下标pos大于等于1且小于等于S串长+1.在串S的第pos个字符前插入串T。
   StrDelete(S,pos,len):串S存在,下标pos大于等于1且小于等于S串长+1-len。从串S中删除第pos个字符其长度为len的子串。
endADT

下面详细举例操作Index的实现算法具体代码:

/*T为非空串。若主串S中第pos个字符之后存在与T相等的子串*/
/*则返回第一个这样的子串在S中的位置,否则返回0*/
int Index(String S,String T,int pos){
   int n,m,i;
   String sub;
   if(pos>0){
      n=StrLength(S);  //主串S的长度
      m=StrLength(T);  //子串T的长度
      i=pos;
      while(i<=n-m+1){  //循环结束条件
         SubString(sub,S,i,m); //取主串第i个位置长度与T相同的子串
         //两子串对比
         if(StrCompare(sub,T)!=0) ++i;  //不等,循环继续,向后查询
         else return i;  //找到,返回该下标
      }
   }
   return 0; //若无子串相等,则返回0.
}

串的比较

字符–标准的ASCII编码,比较字符间的编码。

给定两个串:s=” a1a2...an ”,t=” b1b2...bm ”,当满足一下条件之一是,s < t。
1. n<m ,且 ai=bi ( i=1,2,...,n )。
2. 存在某个 kmin(m,n) ,使得 ai=bi(i=1,2,...,k1),ak<bk

其实简单来说,就是当两个字符串前面都相同时,长度更长的那个串值越大;若两个字符串从头开始比较,当前位置字符值更大的串值越大。

串的存储结构

串的顺序存储结构

串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。预定义,固定长度,定长数组存储。一般可以将实际串长值保存在数组的0下标位置,有些存储在数组最后一个下标位置。也有部分用”\0”来表示串值得终结,此时,串长可遍历得到,也占用了一个空间。在串的顺序存储中,有些字符串的操作,例如字符串连接、插入、替换等可能使串序列长度超过数组长度MaxSize。

串的链式存储结构

与线性表相似,串种每个元素数据均是一个字符,若简单用链表存储,一个结点对应一个字符,会造成很大的空间浪费。当然也可考虑存放多个字符,最后一个结点若未被占满,可用”#”或其他非串值字符补全,存放字符直接影响串处理的效率,根据实际情况而定。

串的链式存储结构除了在连接串与串间操作方便外,总的来说,不如顺序存储灵活,性能也不急顺序存储结构。

你可能感兴趣的:(数据结构)