串(String)
看完你能准确说出串的术语体系,并用 ADT 三要素完整描述它
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
串(String)
看完你能准确说出串的术语体系,并用 ADT 三要素完整描述它
串的定义
前一页我们认识了串:一串排成队的字符。那它在数据结构里到底是什么身份?答案有点意外——它就是线性表,只是每个位置上坐的必须是字符,而且队伍可以为空。
普通列车车厢可装万物对应线性表,货车专列只运煤对应串只存字符
串 vs 其他线性表
串也是线性表,但操作对象从单个元素变成了整个串——这是初学者最常混淆的点。
- 操作对象:单个元素
- 查找按值或按位,元素独立
- 插入删除以元素为单位
- 操作对象:整个串或子串
- 查找是子串定位(模式匹配)
- 插入删除以子串为单位
空串与空白串
上一页说串是字符组成的线性表,那最简单的串长什么样?想象你写了一条消息却一个字都没打,发送出去——对方收到的是空串,还是空白串?两者看似一样,其实完全不同。
空串是空信封,空白串是信封里装了几张白纸
自测:定义辨析
下列关于串的说法,正确的是?
子串与主串
上一页我们认识了空串这个特殊成员。现在看更一般的情况:从一本书里截取一段话,这段话和整本书是什么关系?串的世界里,这就是子串与主串。
截出的那段话对应子串,整本书对应主串
字符与子串的位置
上一页我们认识了子串与主串。那子串在主串里“待在第几位”?生活中找人先问门牌号,串里定位也要靠序号——但同一个字符,位置未必只有一个。
门的入口门牌对应子串首字符的序号
串相等与空串是子串
「相等」看整体,「子串」看局部——两套规则容易搅在一起。
- 两串长度必须相等
- 对应位置字符逐一相同
- 看的是整体,一个字符都不能差
- 长度允许远小于主串
- 字符无需对应比较
- 看的是局部,包含即成立
术语关系一图看全
以主串 DATASTRUCT 为例,沿箭头看:主串如何截取出子串,子串的两个位置量分别是什么。
自测:术语应用
已知主串 S="abcdef",子串 T="cd",T 在 S 中的位置是?
ADT 是什么
前面我们定义了串、空串、子串这些术语,但你有没有想过:说清一个数据结构,到底要说清哪几件事?数学家常问的是「它是什么」和「它能干什么」,这正是 ADT 的出发点。
遥控器上只有按键说明对应操作只管「能做什么」,不关心内部电路即实现
串的 ADT:数据对象与关系
上页说了 ADT 是「数据对象+关系+操作」的三件套。那把模板套到串上:串里装的是什么?它们之间按什么规则排队?先把前两件填上,操作留到下页。
车厢对应字符,挂接顺序对应线性序,整列车对应操作对象
串的基本操作
串的 ADT 操作逐个过一遍,按“不改动→产生新串”的脉络看。
ADT 三要素结构图
从根节点 ADT 出发,两分钟看清三要素各自装什么、串里对应什么。
本组图解收束
- ✓串=受限线性表,元素只能是字符
- ✓空串与空白串是两个概念,别混
- ✓空串是任何串的子串,位置约定是边界
- ✓ADT 三要素:对象、关系、操作
课后思考
三个问题,先自己想,再对照参考答案。
参考答案ADT 只刻画逻辑结构,不管存储与取值细节。字符内容属于数据对象的取值范围,关系层面串就是受限的线性序列,这正是 ADT 抽象性的体现。
参考答案对比接口名、参数与实际行为是否一致,比如叫 get 却修改了内部状态。ADT 要求操作语义明确可预期,名实不符的接口正是抽象泄漏的信号。
参考答案定义仍成立,操作照样由数据对象和关系推出,但会丢失“字符序”这一约束带来的特性,如连续性、匹配算法的适用前提。抽象换来通用,也丢掉了特化优势。