【数据结构】串(字符串):基本概念与存储

考点频率 :★★★☆☆(选择题常考,是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

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #串 #字符串 #数据结构 #软考备考

相关推荐
纵有疾風起3 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk5553 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
Hotchip_MEMS4 小时前
TWS耳机微米级较量:超薄LGA封装如何助力MEMS麦克风小型化?
人工智能·笔记·物联网·电脑
Ztt6666666664 小时前
金泉方壶四面端正,月白釉却把棱角放柔了
经验分享·笔记·其他·百度·微信公众平台
学习和思考4 小时前
非自动化专业如何自学PLC?我的6个月学习路线图
笔记·学习·自动化·学习方法
LuminousCPP4 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2084 小时前
leetcode 三数之和
数据结构·算法·leetcode
青山木5 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode
疯狂打码的少年5 小时前
【数据结构】栈的应用:表达式求值(后缀表达式)
java·数据结构·笔记·算法