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

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

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

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

相关推荐
滕州市燕猫虎计算机科技工作室个体工商户5 小时前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
志尊宝6 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
后季暖8 小时前
电商问数笔记(2)
笔记
xier_ran8 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
Shaoshing9 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_39 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
星恒随风10 小时前
Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解
linux·运维·笔记·学习·状态模式
罗西的思考10 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (7)— 混合机制
笔记·学习
suhan11 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法