数据结构(12.1)串结构的定义

本文介绍了串(字符串)作为一种特殊数据结构的定义及其在C和Java中的表现形式。串的长度、空串、子串、主串等相关概念被详细阐述。文章还探讨了串的两种存储结构——顺序存储(包括定长顺序表示和堆分配表示)和链式存储,讨论了各自的特点和应用场景。

前言

串是一种比较特殊的数据结构,它是计算机上非数值处理的主要对象。

事实上在C语言中,是没有“字符串”这个变量类型的,虽然可以通过字符指针 char *p 这样来记录一个字符串,p本质上仍是一个字符指针,保存的是一个字符的地址。因此,C语言中的保存一个字符串,只是保存它首个字符的地址。但是到了诸如Java这样的语言里,提供了一种String类,可以直接用String s 来记录字符串,String和int、char一样是一种数据类型(只不过不是基本的数据类型,而是属于引用类型)。并且Java提供了很多操作函数,可以直接实现对字符串的相关操作。当然,C语言中虽然没有明确的字符串类型,但是同样存在字符串操作函数。

串的定义

  • 定义:串(或字符串)是由零个或多个字符组成的有限序列,一般记为:s = ‘a1a2…an’(n>=0)
  • 串的名称:s
  • 串的值:用单引号(有些书中也用双引号)括起来的字符序列,可以是数字、字母或者其他字符。但是单引号本身不属于串,它的作用是避免与变量名或数的常量混淆。
  • 串的长度:n

有关概念

  • 空串:零个字符的串称为空串,其长度为零。例如 s = ‘’。

  • 子串:串中任意个连续的字符组成的子序列称为该串的子串,例如 s = ‘abcde’,t = ‘abc’,则 t 是 s 的子串

  • 主串:包含子串的串相应地称为主串,例如 s = ‘abcde’,t = ‘abc’,那么 s 就是 t 的主串

  • 串的位置:字符在序列中的序号称为该字符在串中的位置,例如s = ‘abcde’,字符’ b '在 s 中的位置就是2(在实际应用中为了方便数组操作,也可以从零开始数,则此处就为1)。

    而子串在主串中的位置,则用子串的第一个字符在主串中的位置来表示。例如 s = ‘abcde’,t = ‘cd’,子串 t 在 s 中的位置为3。

  • 串相等:只有两个串的长度相等,并且各个对应位置的字符都相等时才称为串相等。例如 s = ‘abc’,t = ‘ab c’,此时 s 和 t 并不相等(空格也属于字符集合中的一个元素)。

  • 空格串:由一个或者多个空格组成的串,称为空格串。例如 s = ’ ',此时 s 串是空格串,但不是空串,其长度为空格的数量。

串的存储结构

回顾线性表的概念:由n(n>=0)个数据特性相同的元素构成的有限序列。

可以发现,同样是有限序列,串的逻辑结构和线性表是很相似的,区别仅在于串的约束对象是字符集。也就是说,假如字符串中存储的是’123456’这么一串,实际上它保存的类型是char,而不是int。

那么,把线性表的存储类型改为char不也能表示串吗?按理来说是这样,但是串与线性表的主要区别是在操作上。在线性表的基本操作中,多以”单个元素“作为操作的对象,例如插入、删除等,多是对某个元素进行操作;而在线性表中,多以“串的整体”作为操作的对象,比如插入,多是插入另一个串,而不是单个字符。因此,串的操作和线性表有很大不同,需要把串当成与线性表不同的逻辑结构来看待。

从存储结构上来说,串也有两种基本的存储结构:顺序存储和链式存储。

顺序存储

有些资料中说,串有三种机内表示方法,分别是定长顺序表示、堆分配存储表示和块链存储表示。实际上,定长顺序表示和堆分配表示都属于顺序存储。

顺序存储的特点是,使用一组地址连续的存储单元来进行存储。我们使用顺序存储结构时,往往需要在一开始去申请一整块的内存空间,然后在我们所申请好的这块内存空间内来插入、删除元素;这样就会出现一个问题:如果这块空间满了,又有新元素需要存入,应该怎么办呢?

在我们以往的实现中,有两种做法:第一种是逻辑上我的这个存储空间已经满了,就不允许再存入了,它的内存是静态的,能存多少元素已经在一开始确定了。而第二种则会在空间满的时候去重新申请一块更大的空间,只有当物理内存真正满了,空间申请失败的时候,才不允许再存入,它的内存是动态分配的。

我们把采用第一种处理方法称为定长顺序表示,定长即串空间的大小在编译的时候就确定了,不允许再更改,顺序则意味着它的地址空间是连续的。而第二种处理方法称为堆分配表示,因为C语言的内存分为五大分区,其中一个区叫做堆(heap)区,这个区的空间可以让程序员来进行分配释放,我们调用malloc和free函数,就是在对堆区的内存进行操作。在堆分配表示中,串的空间可以动态分配,意味着串长可以任意(只要不超过实际的内存),但是它的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值