串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢!


一、串(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

  1. n<m,且ai=bi (i=1,2,…,n)。(eg:“hap”&“happy”)
  2. 存在某个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码表:
ASCII码表Unicode码表:
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,返回值<0Concat(T, S1, S2): 用T返回由S1和S2连接而成的新串。
	SubString(Sub, S, pos, len): 串S存在,1<=pos<=StrLength(S),且
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值