前言
废话不多,数据结构必须学! 每天更新一章,一篇写不完的话会分成两篇来写~
五、串
5.1串的定义
串string)是由零个或多个字符组成的有限序列,又名叫字符串。
一般记为s = "a1a2a3a4......an"(n>0),其中,s是串的名称,用双引号括起来的字符序列是串的值,单引号不属于串的内容
串中的字符数目n称为串的长度,零个字符的串称为空串,可以用“”表示也可以用空集表示
5.2串的比较
两个数字其实很好比较,但是字符串之间是如何进行比较的呢?
比如:“silly” 和“stupid”它俩谁大?
第一个字母都是s,我们认为大小不存在差异,而第二个字母,i比t更靠前,所以我们说:“silly” > "stupid"
事实上串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集的序号
计算机中常用字符是使用标准ASCII编码,更准确一点,由7位二进制数表示一个字符,共可以表示128个字符,后来不够用了扩展ASCII码由8位二进制数表示一个字符,共可以表示256个字符,已经足够满足以英语为主的语言和特殊符号进行输入、存储、输出等操作的字符需要了。
显然这256个字符是不够的,因此后来就有了Unicode 编码,比较常用的是由16位的二进制数表示-一个字符,这样总共就可以表示216个字符,约是65万多个字符,足够表示世界上所有语言的所有字符了。当然,为了和ASCII码兼容Unicode的前256个字符与ASCII码完全相同。
5.3串的抽象数据类型
对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找一个元素,插入或删除一个元素,但串中更多的是查找子串位置、得到指定位置子串、替换子串等操作。
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,若S=T,返回0,若S<T,返回值<0。 Concat (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
下一节我们来介绍串的存储结构和一些常见的模式匹配算法