此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢!
一、串(String)的定义:
- 串(String):由零个或多个字符组成的有限序列,又名叫字符串。
一般记作 s=“a1a2…an” (n>=0),其中s是串的名称,用双引号(有些书也用单引号)括起来的字符序列是串的值,注意引号不属于串的内容。ai (1<=i<=n)可以是字母、数字或其它字符。 i 就是该字符在串中的位置。串中的字符数目 n 称为串的长度。
这里解释几个概念:
- 空串(null string):零个字符的串,它的长度为零,可以用两引号""表示,也可以用希腊字母(空集)表示。
- 空格串:指只包含空格的串,是有内容有长度的,而且可以不只有一个空格。
- 子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。
(eg: “lover”&“over”, “friend”&“end”, “believe”&“lie”)
二、串的比较:
串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。
因此,要在C语言中比较两个串是否相等,必须是它们串的长度以及它们各个对应位置的字符都相等时,才算是相等。即给定 s1=“a1a2…an”,s2=“b1b2…bn”,当且仅当n=m,且a1=b1, a2=b2, …, an=bn时,才认为s1=s2。
对于两个不相等的串(s1=“a1a2…an”, s2=“b1b2…bm”, n !=m),当满足以下条件之一时,认为s1<s2:
- n<m,且ai=bi (i=1,2,…,n)。(eg:“hap”&“happy”)。
- 存在某个k<=min(m,n),使得ai=bi (i=1,2,…,k-1), ak<bk。(eg:“happen”&“happy”)。
(应用:电子词典中查找单词实现的原理,其实就是字符串这种数据结构的典型应用。)
关于上述“对应字符集中的序号”的相关知识:
计算机中的常用字符是使用标准的ASCII编码,由7位二进制数来表示一个字符,总共可以表示128个字符。后来发现一些特殊符号,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256个字符。
扩展后的ASCII码已经足够满足以英语为主的语言和特殊符号进行输入、存储、输出等操作的字符需要了。但对于其它语言和文字而言,如中文,256个字符显然是不够的。于是后来就有了Unicode编码,比较常用的是由16位二进制数表示一个字符,这样就总共可以表示216个字符(约为6.5万多个)。
(为了和ASCII码兼容,Unicode编码的前256个字符与ASCII码完全相同。)
ASCII码表:
Unicode码表:
三、串的抽象数据类型:
串的逻辑结构和线性表很相似,不同之处在于串针对的是字符集,也就是串中的元素都是字符。
因此,对于串的基本操作与线性表是有很大差别的。线性表更关注的是单个元素的操作,比如查找、插入或删除一个元素;而串中更多的是查找子串位置、得到指定位置的子串、替换子串等操作。
Data: 串中元素仅由一个字符组成,相邻元素具有前驱和后驱的关系。
[ADT of strings:]
Operations:
StrAssign(T, *chars): 生成一个其值等于字符串常量chars的串T。
StrCopy(T, S): 串S存在,由串S复制得到串T。
ClearString(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),且