串(字符串)

串的定义

串是由零个或多个字符组成的有限序列,又名叫字符串。一般记为s=“a1a2…an”(n>=0),其中s是串的名称,用双引号括起来的字符序列是串的值,注意引号不属于串的内容。串中的字符数目n称为串的长度。零个字符的串称为空串

下面是一些需要注意的基本概念:

(1)序列:说明串的相邻字符之间具有前驱和后继的关系

(2)空格串:是只包含空格的串。它和空串是不同的,有内容,有长度,而且可以不止一个空格

(3)子串和主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串

(4)子串在主串中的位置就是子串的第一个字符在主串中的序号

串的比较

串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。

计算机中的常用字符是使用标准的ASCII编码,更准确一点是由7位二进制数表示一个字符,总共可以表示128个字符。后来发现一些特殊符号,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256位。后面又由于世界各地各种语言的差异,256个字符肯定不够表示,出现了Unicode编码,比较常用的是由16位的二进制数表示一个字符,总共可以表示6.5万,足够表示世界上所有语言的所有字符。当然为了兼容ASCII码,Unicode的前256个字符与ASCII码完全相同

那么对于两个不同的串,我们如何判定它们的大小呢?

给定两个串:s=“a1a2…an”,t=“a1a2…am”,当满足以下条件之一时,s<t.

(1)n<m,且ai=bi(i=1,2,…,n)。

(2)存在某个k<=min(m,n),使得ai=bi(i=1,2,…,k-1),ak<bk

串的抽象数据类型

串中最常见的操作就是查找子串位置、得到指定位置子串、替换子串等操作。西面是抽象数据类型的定义:

ADT 串(string)
Data
	串中元素仅由一个字符组成,相邻元素具有前驱和后继关系
Operation
	StrAssign(T,*chars):生成一个其值等于字符串常量chars的串T。
	StrCopy(T,S):串S存在,由串S复制得到串T。
	ClearString(S):串S存在,将串清空。
	StringEmpty(S):若串S为空,返回true,否则返回false
	StrLength(S):返回串S的元素个数,即串的长度。
	StrCompare(S,T):若S>T,返回值>0,若相等,返回0,若S<T,返回值<0Concat(T,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的子串。
endADT

下面以Index函数的实现为例进行一个简单说明。

/*T为非空串。若主串中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0*/
int Index(String S,String T,int pos){
	int n,m,i;
	String sub;
	if(pos>0){
		//得到主串S的长度
		n = StrLength(S);
		//得到子串T的长度
		m=StrLength(T);
		i = pos;
		while(i<= n-m+1){
			//取主串第i个位置,长度与T相等子串给sub
			SubString(sub,S,i,m);
			if(StrCompare(sub,T) != 0){
				++i;
			}else{
				return i;
			}
		}
	}

	return 0;
}

串的存储结构

串的顺序存储

串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数组来定义。这种存储方式通常是有问题的,因为字符串的操作,如两串的concat、新串的insert,以及字符串的替换replace,都有可能使得串序列的长度超过了数组的长度MaxSize。

串的链式存储

对于串的链式存储结构,与线性表相似,但由于串结构的特殊性,结构中的每个元素数据是一个字符,如果也简单的应用链表存储串值,一个结点对应一个字符就会存在很大的空间浪费。因此一个结点可以存放一个字符,也可以考虑存放多个字符,最后一个结点若是未被占满时,可以用“#”或其他非串值字符补全,如下:
串的链式存储

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值