大话数据结构---串

串的定义

早先的计算机在被发明时,主要作用是做一些科学和工程的计算工作,也就是现在我们所理解的计算器,只不过它比小小计算器功能更强大、速度更快一些。后来发现,在计算机上做非数值处理的工作越来越多,使得我们不得不需要引入对字符的处理。于是就有了字符串的概念。

比如我们现在常用的搜索引擎,当我们在文本框中输入“数据”时,它已经把我们想要的“数据结构”列在下面了。显然这里网站做了一个字符串查找匹配的工作。如下图:
在这里插入图片描述
今天我们就是研究“串”这样的数据结构。先来看定义。

串:串(string)是由0个或多个字符组成的有限序列,又名叫字符串。

一般记为 s=“a1a2a3…an”(n>=0),其中,s是串的名称,用双引号(有些书也用单引号)括起来的字符序列是串的值,主要单引号不属于串的内容。ai (1 <= i <= n) 可以是字母、数字或其他字符,i就是该字符在串中的位置。串中的字符数据n称为串的长度,定义中谈到“有限”是指长度n是一个有限的数值。零个字符的串称为空串(null string),它的长度为零,可以直接使用双引号“”表示,也可以用希腊字母 xx 来表示。所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。

还有一些概念需要解释。

空格串,是只包含空格的串。注意它和空串的区别,空格串是有内容有长度的,而且可以不止一个空格。

子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应的,包含子串的串称为主串。

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

开头我所提到的“over”、“end"、”lie"、其实都可以认为是"lover"、“friend”、“believe” 这些单词字符串的字串。

串的比较

两个数字,很容易比较大小。2比1大,这完全正确,可是两个字符串如何比较大小?比如 “silly”,“stupid”这样的同样表达“愚蠢的”的单词字符串,它们在计算机中的大小其实取决于他们挨个字母的前后顺序。它们的第一个字母都是“s",我们认为不存在大小差异,而第二个字母,由于’i’比’t‘字母要靠前,所以’i’ < ‘t’,于是我们说 “silly” < “stupid”。

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

计算机中的常用字符是使用标准的ASII码,更准确点,由7位二进制数表示一个字符,总共可以表示128个字符。后来发现一些特殊的符号出现,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256个字符,这些已经可以满足以英语为主的语言和特殊符号输入、存储、输出等操作的字符需要了。可是,单我们国家就有除汉族外的满、回、藏、蒙古、维吾尔等多少个少数名族文字,换作全世界估计要有成千上百种文字,显然这256种字符是不够的,因此后来就有了Unicode编码,比较常用的是由16位二进制数表示一个字符,这样共可以2^16个字符,约是65万多个字符,足够表示世界上所有语言的所有字符了。当然,为了和ASII码兼容,Unicode的前256个字符与ASCII码完全相同。

所以我们在c语言中比较两个串是否相等,必须是它们串的长度以及它们对应位置的字符都相等时,才算相等。即给定两个串:s=“a1a2a3…an”,t=“b1b2b3…bm”,当且仅当n=m,且a1=b1,a2=b2,…,an=bm时,我们认为s=t。

那么对于两个串不相等时,如何判定它们大小呢。我们这样定义:
给定两个串:s=“a1a2a3…an”,t=“b1b2b3…bm”,当满足以下条件之一时,s<t。

1 n < m,且ai = bi (i=1,2,…,n)。
例如 当 s=“hap”,t=“happy”,就有s<t。因为t比s多出了两个字母。

2 存在某个k <= min(m, n),使得ai=bi (i=1, 2, …, k-1), ak < bk。
例如 当s=“happen”,t=“happy”,因为两串的前4个字母均相同,而两串第5个字符(K值),字母e的ASCII码是101,而字母y的ASCII的码是121,显然e<y,所以s<t。

字符串比较的应用,我们的英语词典通常就是成千上万个单词的有序排列。就大小而言,前面的单词比后面的要小。你在查找单词的过程,其实就是在比较字符串大小的过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值