考点频率 :★★★☆☆(选择题常考,是KMP算法的基础知识)
难度 :⭐
建议:掌握串的定义、基本概念(空串/空格串/子串/主串),理解串的三种存储方式
1️⃣ 什么是串?
串(String) 是由零个或多个字符组成的有限序列 ,通常称为字符串。
从数据结构的角度来看,串是一种特殊的线性表 ------它的数据元素是单个字符 。线性表的所有基本操作(如插入、删除、查找)都适用于串,但串更强调整体处理(如整体赋值、比较、拼接)。
基本术语:
| 术语 | 含义 | 示例 |
|---|---|---|
| 串的长度 | 串中字符的个数 | "hello" 的长度为 5 |
| 空串(Null String) | 长度为 0 的串,不包含任何字符 | "" |
| 空格串(Blank String) | 只包含空格字符的串 | " "(长度为3) |
| 子串(Substring) | 串中任意连续字符组成的子序列 | "llo" 是 "hello" 的子串 |
| 主串(Main String) | 包含子串的串 | "hello" 是 "llo" 的主串 |
| 串的位置(Position) | 字符在串中的序号(通常从 1 开始) | "hello" 中 'e' 的位置是 2 |
空串 vs 空格串:空串长度为0,不含任何字符;空格串长度为空格字符的个数,每个空格也是一个字符。两者在考试中经常作为概念辨析题出现。
2️⃣ 串的存储结构
2.1 定长顺序存储(静态数组)
用一组地址连续的存储单元存储串中的字符,串的长度固定。
c
#define MAXLEN 100
typedef struct {
char ch[MAXLEN]; // 存储字符
int length; // 串的实际长度
} SString;
特点:
- 实现简单,随机访问 O(1)O(1)O(1)
- 容量固定,可能浪费空间或溢出
- 截断问题:赋值时如果超过最大长度,需要截断
2.2 堆分配存储(动态数组)
在程序运行时,根据串的长度动态分配存储空间。
c
typedef struct {
char* ch; // 指向动态分配的存储空间
int length; // 串的实际长度
} HString;
特点:
- 按需分配,不会浪费空间
- 插入、删除操作灵活
- 需要手动管理内存(分配和释放)
2.3 链式存储(链表)
用单链表存储串中的字符,每个节点可以存储一个字符或多个字符。
c
// 每个节点存一个字符
typedef struct StringNode {
char ch;
struct StringNode* next;
} StringNode;
特点:
- 插入、删除操作方便
- 存储密度低(每个字符多一个指针)
- 可以优化:每个节点存储多个字符(如4个),提高存储密度
2.4 三种存储方式对比
| 对比项 | 定长顺序 | 堆分配 | 链式存储 |
|---|---|---|---|
| 存储方式 | 连续内存,固定长度 | 连续内存,动态分配 | 分散内存(指针链接) |
| 随机访问 | ✅ O(1)O(1)O(1) | ✅ O(1)O(1)O(1) | ❌ O(n)O(n)O(n) |
| 存储密度 | 高 | 高 | 低(有指针开销) |
| 容量限制 | 固定,可能溢出 | 按需分配 | 无限制 |
| 适用场景 | 串长度可预知 | 串长度变化较大 | 插入/删除频繁 |
3️⃣ 串的基本操作(了解即可)
| 操作 | 含义 |
|---|---|
| 赋值(StrAssign) | 将字符串常量赋给串变量 |
| 复制(StrCopy) | 将一个串复制到另一个串 |
| 判空(StrEmpty) | 判断串是否为空 |
| 比较(StrCompare) | 比较两个串的大小(按字典序) |
| 求长度(StrLength) | 返回串中字符的个数 |
| 拼接(Concat) | 将两个串连接成一个新串 |
| 求子串(SubString) | 返回串中从某位置开始的连续子串 |
| 查找(Index) | 在串中查找子串的位置 |
4️⃣ 经典例题
例题1:以下关于串的说法中,正确的是( )。
A. 空串和空格串是相同的
B. 串是一种特殊的线性表
C. 串的长度是指串中有效字符的个数,不包括空格
D. 链式存储是串存储的最佳方式
解析 :A错误------空串不含任何字符,空格串包含空格字符;C错误------空格也是字符,应计入长度;D错误------链式存储存储密度低,各存储方式各有适用场景,没有"最佳"。B正确------串的数据元素是单个字符,因此是特殊的线性表。选 B。
例题2 :设串 S = "Data Structure",则 S 的长度为( ),子串 "Struct" 在 S 中的起始位置为( )。
A. 13;6
B. 14;5
C. 13;5
D. 14;6
解析 :"Data Structure" 共14个字符(含中间的空格),"Struct" 从第6个字符开始(下标从1开始,D=1,a=2,t=3,a=4,空格=5,S=6)。选 D。
5️⃣ 记忆口诀
串是字符线性表,长度字符总个数。
空串不含任何字符,空格串里有空格。
顺序存储空间有限,链式存储指针多。
6️⃣ 小测验(评论区对答案)
设串
S = "Hello World",则S的长度为( )。A. 10
B. 11
C. 12
D. 13
🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #串 #字符串 #数据结构 #软考备考