当前位置: 首页 > news >正文

第6章串数组:串的定义和存储结构

第 6 章 串、数组

6.1 串的定义和存储结构

6.1.1 串的定义

串(String)或字符串是由零个或多个字符组成的有限序列。

一般记作:
s="a1a2⋯an" (n≥0) s = ^"a_1a_2\cdots a_n^"~(n\ge0) s="a1a2an" (n0)
其中:

  • sss 是串的名;
  • 用双引号或单引号括起来的字符序列是串的值。注意:引号不是串的内容,是串的标志,用于将串与标识符(如变量名称等)加以区别。
  • ai (1≤i≤n)a_i~(1\le i\le n)ai (1in) 代表一个字符,比如英文字母、数字、常用的标点符号以及空格等各种合法字符。
  • 串中字符的数目 nnn 称为串的长度。
  • 零个字符的串称为空串,通常用 ϕ\phiϕ 表示。空串的长度为零。

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

通常,称字符在序列中的序号为该字符在串中的位置。子串在主串中的位置以子串的第一个字符在主串中的位置来表示。

两个串相等,当且仅当两个串的值相等,即:两个串的长度相等并且对应位置上的字符都相等。

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。另外,串的基本操作和线性表有很大差别:

  • 在线性表的基本操作中,大多以“单个元素”作为操作对象,例如,在线性表中查找某个元素,求取某个元素,在某个位置上插入一个元素或删除一个元素等;
  • 在串的基本操作中,通常以“串的整体”作为操作对象,例如,在串中查找某个子串,求取一个子串,在串的某个位置上插入一个子串,以及删除一个子串等。

6.1.2 串的存储结构

1. 串的顺序存储

串的顺序存储结构,即用一组地址连续的存储单元存储串值的字符序列。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,这样就构造了串的定长顺序存储结构。

//串的定长顺序存储结构
#define MAXLEN 255  //串的最大长度typedef struct{char ch[MAXLEN+1]; //存储串的一维数组int length;  //串的当前长度
}SString;
  • MAXLEN 表示串的最大长度;
  • ch 是存储字符串的一维数组,每个分量存储一个字符(以 ch[MAXLEN+1] 定义数组,意味着从下标为 1 的数组分量开始存储的,下标为 0 的分量闲置不用);
  • length 表示当前字符串的长度。

串的定长顺序存储结构,是静态的定义方式,在编译时已确定了串空间的大小。

此外,C 语言中,提供了另外一种利用堆实现的顺序存储结构。这种存储结构可以为每个新生成的串动态分配一块实际串长所需的存储空间,称之为串的堆式顺序存储结构。

//串的堆式顺序存储结构
typedef struct{char *ch; //若是非空串,则按串长分配存储区,否则 ch 为 NULLint length;
}HString;

关于串的基本操作,和顺序表类似,所以不作为重点。

2. 串的链式存储

一般,采用单链表作为串的链式存储方式。

由于串结构中的每个数据元素是一个字符,在用链表存储串值时,就存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个字符。

例如,图 6.1.1(a) 所示为结点大小为 4(即每个结点存放 4 个字符)的链表,图 6.1.1(b) 所示为结点大小为 1 的链表。

在这里插入图片描述

图 6.1.1 串的单链表表示

当结点大小大于 1 时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上“#”或其他的非串值字符(通常“#”不属于串的字符集,是一个特殊的符号)。

为了便于进行串的操作,当以链表存储串值时,除了头指针外,再附设一个尾指针指示链表中的最后一个结点,并且给出当前串的长度。这种串存储结构称为块链结构。

//串的链式存储结构
#define CHUNKSIZE 80 //可由用户定义的块大小typedef struct Chunk{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct{Chunk *head, *tail; //串的头和尾指针int length;  //串的当前长度
}LString;

当串采用链式存储结构时,它的各项操作类似于链表,所以此处不详细讨论。


文章转载自:

http://ppPthOhr.dnpft.cn
http://J6xD6JEn.dnpft.cn
http://S1UwaFVM.dnpft.cn
http://s2PJW6xg.dnpft.cn
http://LLEULYSD.dnpft.cn
http://WxQbSqjW.dnpft.cn
http://QpXzJnBT.dnpft.cn
http://8i0aS5Qf.dnpft.cn
http://lEBPGxxt.dnpft.cn
http://ME09Sh4V.dnpft.cn
http://pFKkdW9K.dnpft.cn
http://AsKJmfKD.dnpft.cn
http://1ucClHE0.dnpft.cn
http://eWaoe5eJ.dnpft.cn
http://ufeTqVN3.dnpft.cn
http://YjuO5rn5.dnpft.cn
http://GzbYF8kJ.dnpft.cn
http://70Y7BVdC.dnpft.cn
http://Awzchvea.dnpft.cn
http://aKh02WRv.dnpft.cn
http://VpKDsZZL.dnpft.cn
http://dT7DLVen.dnpft.cn
http://qpCASBAA.dnpft.cn
http://CIClQ1O9.dnpft.cn
http://dOtkCVFc.dnpft.cn
http://iyFG53ey.dnpft.cn
http://YIaIH5Oq.dnpft.cn
http://P4FfL0bk.dnpft.cn
http://QzarJIfn.dnpft.cn
http://2PgiQKRh.dnpft.cn
http://www.dtcms.com/a/376130.html

相关文章:

  • tina linux新增mpp程序
  • capacitor配置ios应用图标不同尺寸
  • 大一新生C语言快速入门
  • Shuriken: 1靶场渗透
  • Pytorch基础入门4
  • 编程工具的演进逻辑:从Python IDLE到Arduino IDE的深度剖析
  • AWS SQS 可观测性最佳实践
  • 【C 语言生成指定范围随机数(整数 + 小数):原理、实现与避坑指南】
  • 【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之android 把assert里的dist.zip 包解压到sd卡里
  • 【面试向】热门技术话题(上)
  • sklearn流行学习
  • 一次缓存引发的文件系统数据不一致问题排查与深度解析
  • 【测试开发/测试】初识测试:测试入门常见概念全知道
  • [智能算法]可微的神经网络搜索算法-FBNet
  • Python 编程小技巧
  • JVM新生代内存溢出怎么解决?
  • 《C++进阶之STL》【set/map 模拟实现】
  • elementUI表格高度异常问题排查思路
  • 光谱相机的图像模式
  • Spring Boot + MyBatis-Plus 单数据源多线程事务一致性实践
  • 考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
  • Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`
  • MySQL数据导出避坑指南:如何选择正确的工具并设计安全的备份策略?
  • 《算法闯关指南:优选算法-双指针》--01移动零,02复写零
  • ACD智能分配:轮流分配和排序上限分配的设置
  • DevOps实战(6) - 使用Arbess+GitHub+SonarQube实现Java项目自动化部署
  • 《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件
  • 【硬件-笔试面试题-81】硬件/电子工程师,笔试面试题(知识点:详细讲讲同步时钟与异步时钟通信)
  • 双RFSOC47DR-16通道5GSPS ADC采集模块
  • Linux学习笔记】信号的产生和用户态和内核态