哈喽,各位备考软考中级软件设计师的小伙伴!数据结构是软考中级的核心考点,占分比重不低(约10-15分),而且是后续算法、编程题的基础,吃透这部分,既能搞定选择题,也能为案例分析、编程题铺路。
这篇博客完全贴合软考考点,摒弃晦涩难懂的理论堆砌,用"图文提示+通俗讲解+考点标注+真题巩固"的方式,把每个高频知识点讲透,不用再翻厚厚的教材,直接看这篇就能高效复习,建议收藏备用!
⚠️ 核心提示:软考数据结构侧重"应用+计算",重点考查线性表、栈和队列、树、图、排序和查找,哈希表、字符串匹配也是高频考点,以下内容完全围绕这些核心展开。
一、数据结构基础概念(软考送分点,必背)
先搞懂基础概念,避免后续知识点混淆,这部分考选择题,难度低,记准就能拿分。
1. 核心定义
-
数据结构:由"数据元素"和"元素之间的关系"组成,简单说就是"数据怎么组织、怎么存储、怎么操作"。
-
逻辑结构 vs 物理结构(高频考点):
-
逻辑结构:数据元素之间的"逻辑关系"(和存储无关),比如排队的人(线性关系)、公司组织架构(树形关系)。
-
物理结构(存储结构):数据在计算机中的"实际存储方式",软考重点考4种:顺序存储、链式存储、索引存储、哈希存储,核心区别看下方总结。
-
-
数据运算:对数据的操作,比如插入、删除、查找、排序,软考重点考"运算的时间复杂度和空间复杂度"。
2. 4种存储结构对比(软考选择题高频)
| 存储结构 | 核心特点 | 优点 | 缺点 | 软考常见应用 |
|---|---|---|---|---|
| 顺序存储 | 元素存储在连续的内存空间,逻辑关系=物理关系 | 随机访问快(O(1)),存储密度高 | 插入/删除慢(需移动元素,O(n)) | 数组、顺序表 |
| 链式存储 | 元素存储在非连续空间,通过指针/引用连接 | 插入/删除快(仅改指针,O(1)),灵活 | 随机访问慢(需遍历,O(n)),占额外空间(存指针) | 链表、树、图的邻接表 |
| 索引存储 | 分"数据区"和"索引区",索引记录元素位置 | 查找快(O(logn)) | 占额外空间(存索引),插入/删除需维护索引 | 数据库索引 |
| 哈希存储 | 通过哈希函数将关键字映射到存储地址 | 查找、插入、删除均快(平均O(1)) | 存在哈希冲突,需解决冲突 | 缓存、哈希表 |
3. 时间复杂度与空间复杂度(软考必考,记准规律)
复杂度是衡量算法/数据结构效率的核心,软考不考复杂推导,只考"常见复杂度排序"和"具体操作的复杂度"。
-
时间复杂度排序(从快到慢):O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ)(软考常考对比,记准顺序)
-
常见操作复杂度(直接记,不用推导):
-
数组随机访问:O(1);数组插入/删除:O(n)
-
链表查找:O(n);链表插入/删除(已知位置):O(1)
-
二叉搜索树(平衡)查找/插入/删除:O(logn);不平衡时退化为O(n)
-
排序算法:快排/归并/堆排 O(nlogn);冒泡/选择/插入 O(n²)
-
基础概念巩固题(软考真题改编)
- 下列关于存储结构的描述中,正确的是( )
A. 顺序存储的元素逻辑关系与物理关系不一致
B. 链式存储的插入操作时间复杂度为O(n)
C. 哈希存储的查找效率平均为O(1)
D. 索引存储不需要额外的存储空间
答案:C(解析:A错误,顺序存储逻辑与物理关系一致;B错误,链式插入已知位置为O(1);D错误,索引存储需额外存索引)
二、线性表(软考核心,必考内容)
线性表是"一对一"的逻辑结构,软考重点考2种:顺序表(数组)和链表,以及它们的对比、操作和应用。
1. 顺序表(数组)
【图文提示】想象成"一排连续的柜子",每个柜子放一个元素,柜子编号(下标)从0开始,能直接通过编号找到元素。
-
核心特点:内存连续,支持随机访问(通过下标直接定位),插入/删除需移动元素。
-
软考高频考点:
-
插入操作:在第i个位置插入元素,需将i及后面的元素全部后移,时间复杂度O(n)。
-
删除操作:删除第i个位置元素,需将i后面的元素全部前移,时间复杂度O(n)。
-
应用场景:静态数据集合(数据量固定,很少插入/删除),比如矩阵存储。
-
2. 链表(软考重点,考法多)
【图文提示】想象成"一串糖葫芦",每个山楂(节点)包含"数据"和"竹签"(指针),竹签连接下一个山楂,不用连续排列。
软考重点考3种链表:单链表、双向链表、循环链表,核心区别看指针方向和尾节点处理。
| 链表类型 | 核心结构 | 软考考点/应用 |
|---|---|---|
| 单链表 | 每个节点只有"数据域"和"一个指针域"(指向后继节点),尾节点指针为null | 考插入/删除操作(改指针),比如"在某个节点后插入新节点" |
| 双向链表 | 每个节点有"数据域"和"两个指针域"(前驱+后继) | 考双向遍历、双向插入/删除,效率比单链表高(不用回溯) |
| 循环链表 | 尾节点指针指向头节点,形成闭环 | 考"判断链表是否为循环链表",应用于环形队列、约瑟夫环问题 |
3. 顺序表与链表对比(软考选择题高频)
直接记这个对比,做题直接套用:
-
访问速度:顺序表 > 链表(顺序表随机访问O(1),链表需遍历O(n))
-
插入/删除速度:链表 > 顺序表(链表改指针O(1),顺序表移元素O(n))
-
存储空间:顺序表(无额外开销) < 链表(需存指针,有额外开销)
-
适用场景:顺序表(静态数据),链表(动态数据,频繁插入/删除)
线性表巩固题(软考真题)
- 【2020年下半年真题】通过元素在存储空间中的相对位置来表示数据元素之间的逻辑关系,是( )的特点。
A. 顺序存储 B. 链表存储 C. 索引存储 D. 哈希存储
答案:A(解析:顺序存储的核心特点就是逻辑关系与物理位置一致,通过相对位置表示逻辑关系)
- 下列关于链表的描述中,错误的是( )
A. 单链表的尾节点指针为null
B. 双向链表支持双向遍历
C. 循环链表的尾节点指针指向头节点
D. 链表的插入操作时间复杂度一定为O(1)
答案:D(解析:若不知道插入位置,需先遍历找到位置,时间复杂度为O(n);已知位置时才是O(1))
三、栈和队列(软考必考,考应用+计算)
栈和队列是"受限的线性表",核心区别是"访问顺序",软考重点考它们的定义、操作、应用,以及栈的出栈序列、队列的假溢出问题。
1. 栈(LIFO:后进先出)
【图文提示】想象成"叠盘子",只能从最上面放盘子(入栈),也只能从最上面拿盘子(出栈),下面的盘子不能直接操作。
-
核心操作(软考必记):
-
push(入栈):将元素加入栈顶
-
pop(出栈):将栈顶元素移除,并返回该元素
-
peek(栈顶元素):查看栈顶元素,不删除
-
-
软考高频考点:
-
出栈序列判断(必考):给定入栈序列,判断哪个出栈序列是不可能的(核心:栈顶元素才能出栈)。
-
应用场景(记准,考选择题):函数调用栈、括号匹配、表达式求值(中缀转后缀)、浏览器前进后退。
-
时间复杂度:所有操作均为O(1)。
-
2. 队列(FIFO:先进先出)
【图文提示】想象成"排队买票",先排队的人先买票(出队),后排队的人后买票(入队),不能插队。
-
核心操作(软考必记):
-
enqueue(入队):将元素加入队尾
-
dequeue(出队):将队头元素移除,并返回该元素
-
front(队头元素):查看队头元素,不删除
-
-
软考高频考点:
-
循环队列(重点):用数组实现队列时,会出现"假溢出"(队尾满了,但队头有空位),解决方法是循环队列(用模运算实现)。
-
特殊队列:优先队列(元素按优先级出队,通常用堆实现),应用于任务调度。
-
应用场景(记准):任务调度、广度优先搜索(BFS)、消息队列。
-
时间复杂度:所有操作均为O(1)。
-
栈和队列巩固题(软考真题+练习题)
- 【2022年下半年真题】设栈初始时为空,对于入栈序列1,2,3,...,n,这些元素经过栈之后得到出栈序列p1,p2,p3,... ,pn,若p3=4,则p1,p2不可能的取值为( )。
A.6,5 B.2,3 C.3,1 D.3,5
答案:C(解析:C选项中,p1=3时,栈中从上到下为2、1;要使p2=1,必须先让2出栈,因此p2不可能是1)
- 下列关于循环队列的描述中,正确的是( )
A. 循环队列解决了队列的"真溢出"问题
B. 循环队列的队满条件是"队尾指针 == 队头指针"
C. 循环队列用模运算实现"循环"
D. 循环队列的入队操作时间复杂度为O(n)
答案:C(解析:A错误,循环队列解决假溢出;B错误,队满条件是(队尾+1)%容量 == 队头;D错误,入队O(1))
四、字符串(软考高频,考定义+模式匹配)
字符串是"由字符组成的线性表",软考重点考字符串的定义、子串计算、模式匹配算法(朴素算法、KMP算法)。
1. 核心定义(记准,考选择题)
-
字符串:由零个或多个字符组成的有限序列,记为S = "a₁a₂...aₙ"(n≥0),n为字符串长度。
-
关键术语:
-
空串:长度为0的串(""),注意和"空格串"(" ")区分。
-
子串:串中任意连续字符组成的子序列(比如"abc"的子串有"a""b""c""ab""bc""abc")。
-
非平凡子串:非空且不同于原串本身的子串(软考曾考计算)。
-
2. 子串个数计算(软考计算题高频)
核心公式:长度为n的字符串,互异的非平凡子串个数 = (n+2)(n-1)/2(推导:长度1的子串n个,长度2的n-1个,...,长度n-1的2个,求和得等差数列和)。
示例:字符串"abc"(n=3),非平凡子串个数 = (3+2)(3-1)/2 = 5(分别是"a""b""c""ab""bc")。
3. 模式匹配算法(软考重点,考原理)
模式匹配:在主串中查找子串(模式串)的位置,软考重点考2种算法,不用写代码,记准核心区别和复杂度。
| 算法名称 | 核心原理 | 时间复杂度 | 软考考点 |
|---|---|---|---|
| 朴素算法(暴力匹配) | 逐个字符比较,失配时主串回溯到起始位置+1,模式串回溯到开头 | O(nm)(n为主串长度,m为模式串长度) | 原理简单,效率低,考"回溯"特点 |
| KMP算法 | 利用"部分匹配表(PMT)",避免主串回溯,仅模式串回溯 | O(n+m) | 核心是next数组(记录前缀与后缀最长公共长度),考next数组构建 |
字符串巩固题(软考真题)
- 【2017年下半年真题】设S是一个长度为n的非空字符串,其中的字符各不相同,则其互异的非平凡子串(非空且不同于S本身)个数为( )。
A.2n-1 B.n² C.n(n+1)/2 D.(n+2)(n-1)/2
答案:D(解析:代入公式计算,长度n的字符串,非平凡子串个数为(2+n)(n-1)/2,示例验证:n=3时,(3+2)(3-1)/2=5,符合实际)
- 下列关于KMP算法的描述中,正确的是( )
A. KMP算法的时间复杂度为O(nm)
B. KMP算法需要主串回溯
C. KMP算法的核心是构建next数组
D. next数组记录的是主串前缀与后缀的最长公共长度
答案:C(解析:A错误,KMP复杂度O(n+m);B错误,KMP不回溯主串;D错误,next数组记录模式串的前缀与后缀最长公共长度)
五、树与二叉树(软考重中之重,考遍历+性质+应用)
树是"一对多"的非线性结构,软考重点考二叉树(最常用、最易考),包括二叉树的性质、遍历方式、特殊二叉树(二叉搜索树、平衡二叉树、哈夫曼树)。
1. 树的基础概念(记准术语)
-
核心术语:根节点(最顶层节点)、叶子节点(无子节点)、父节点/子节点、节点的度(子节点个数)、树的深度(层数)。
-
二叉树定义:每个节点最多有2个子节点(左子树、右子树),软考所有树的考点都围绕二叉树展开。
2. 二叉树的核心性质(软考计算题高频)
-
性质1:在二叉树的第k层,最多有2^(k-1)个节点(k≥1)。比如第1层1个,第2层2个,第3层4个。
-
性质2:深度为h的二叉树,最多有2^h - 1个节点(满二叉树)。
-
性质3:对于任意一棵二叉树,叶子节点数 = 度为2的节点数 + 1(记准公式,直接套用)。
-
性质4:完全二叉树(最后一层节点左对齐,其他层全满)的节点编号:若父节点编号为i,则左子节点为2i,右子节点为2i+1。
3. 二叉树的遍历(软考必考,记准顺序)
遍历是"按一定顺序访问所有节点",软考重点考3种深度优先遍历(前序、中序、后序)和1种广度优先遍历(层次遍历),记准顺序和应用。
| 遍历方式 | 访问顺序 | 软考应用 |
|---|---|---|
| 前序遍历(根左右) | 先访问根节点,再访问左子树,最后访问右子树 | 复制二叉树、获取树的结构 |
| 中序遍历(左根右) | 先访问左子树,再访问根节点,最后访问右子树 | 二叉搜索树中,中序遍历得到有序序列 |
| 后序遍历(左右根) | 先访问左子树,再访问右子树,最后访问根节点 | 释放二叉树内存 |
| 层次遍历(按层访问) | 从根节点开始,逐层访问,每一层从左到右 | 广度优先搜索(BFS)、求树的深度 |
【示例】一棵二叉树,根为A,左子树为B(B的左为D、右为E),右子树为C(C的右为F):
前序:A → B → D → E → C → F;中序:D → B → E → A → C → F;后序:D → E → B → F → C → A;层次:A → B → C → D → E → F。
4. 特殊二叉树(软考高频,记准性质)
-
二叉搜索树(BST):
-
性质:左子树所有节点值 ≤ 根节点值 ≤ 右子树所有节点值。
-
考点:查找、插入、删除的性质,平衡时查找复杂度O(logn),不平衡时退化为O(n)(类似链表)。
-
-
平衡二叉树(AVL树):
-
平衡条件:任意节点的左右子树高度差 ≤ 1。
-
考点:平衡调整操作(左旋、右旋、左右旋、右左旋),用于解决二叉搜索树不平衡的问题。
-
-
哈夫曼树(最优二叉树):
-
定义:带权路径长度(WPL)最短的二叉树,权值大的节点靠近根节点。
-
构建步骤:① 将权值作为叶子节点;② 每次选权值最小的两个节点合并,生成新父节点(权值为两子节点之和);③ 重复直至只剩一棵树。
-
考点:哈夫曼编码(数据压缩),WPL计算(所有叶子节点的"权值×路径长度"之和)。
-
树与二叉树巩固题(软考真题+练习题)
- 一棵深度为5的完全二叉树,最多有多少个节点?( )
A. 15 B. 31 C. 32 D. 63
答案:B(解析:深度h的完全二叉树,最多节点数=2^h -1,代入h=5,2^5 -1=31)
- 已知一棵二叉树的前序遍历为A→B→D→E→C,中序遍历为D→B→E→A→C,则后序遍历为( )
A. D→E→B→C→A B. D→E→B→A→C C. D→B→E→C→A D. D→B→E→A→C
答案:A(解析:前序确定根为A,中序确定A的左子树为D→B→E,右子树为C;再逐步推导左子树结构,最终得到后序遍历)
- 下列关于哈夫曼树的描述中,正确的是( )
A. 哈夫曼树的节点度只能是0或2
B. 哈夫曼树的带权路径长度是最小的
C. 哈夫曼树的深度一定是最小的
D. 哈夫曼树的节点个数一定是偶数
答案:B(解析:A错误,哈夫曼树节点度可以是1;C错误,深度不一定最小;D错误,节点个数为2n-1,n为叶子节点数,可能为奇数)
六、图(软考高频,考存储+遍历+最短路径)
图是"多对多"的非线性结构,软考重点考图的存储方式、遍历方式、最短路径算法,难度适中,记准核心考点即可。
1. 图的基础概念(记准术语)
-
核心术语:顶点(节点)、边(顶点之间的连接)、有向图(边有方向)、无向图(边无方向)、权重(边的数值)、度(顶点连接的边数)。
-
软考考点:无向图的邻接矩阵存储空间(n²,n为顶点数),有向图的入度/出度。
2. 图的存储方式(软考必考,2种)
| 存储方式 | 核心结构 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 邻接矩阵 | 用n×n的矩阵表示,matrix[i][j]表示顶点i和j之间的边 | 判断两顶点是否相连快(O(1)),计算度方便 | 存储空间大(n²),稀疏图浪费空间 | 稠密图(边多) |
| 邻接表 | 每个顶点对应一个链表,存储该顶点连接的所有顶点 | 存储空间小,适合稀疏图 | 判断两顶点是否相连慢(需遍历链表) | 稀疏图(边少) |
3. 图的遍历(软考必考,2种)
-
深度优先遍历(DFS):
-
原理:从起点出发,尽可能往深走,走不通再回溯(类似走迷宫,一条路走到黑)。
-
实现:用栈或递归。
-
-
广度优先遍历(BFS):
-
原理:从起点出发,先访问所有相邻顶点,再依次访问每个相邻顶点的相邻顶点(类似水波扩散)。
-
实现:用队列。
-
4. 最短路径算法(软考高频,记准适用场景)
-
Dijkstra算法:
-
核心:求"单源最短路径"(从一个起点到其他所有顶点的最短路径)。
-
考点:适用场景(边的权重非负),记准算法名称和用途。
-
-
Floyd算法:
-
核心:求"所有顶点之间的最短路径"。
-
考点:适用场景(任意权重,包括负权重,但无负环),时间复杂度O(n³)。
-
图巩固题(软考真题+练习题)
- 一个有8个顶点的无向图,用邻接矩阵存储,其存储空间大小为( )
A. 8 B. 16 C. 32 D. 64
答案:D(解析:邻接矩阵存储空间为n²,n=8,8×8=64)
- 下列算法中,用于求单源最短路径的是( )
A. Floyd算法 B. Dijkstra算法 C. 冒泡排序 D. 快速排序
答案:B(解析:Floyd求所有顶点最短路径;排序算法与最短路径无关)
七、排序与查找(软考必考,考复杂度+应用)
排序和查找是数据结构的核心应用,软考重点考"排序算法的对比""查找算法的对比",以及它们的时间复杂度、空间复杂度、稳定性。
1. 排序算法(软考高频,记准对比表)
软考不考排序代码,只考"复杂度、稳定性、适用场景",记准下面的对比表,做题直接套用。
| 排序算法 | 时间复杂度(平均) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 | 软考考点/应用 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 | 简单,适合小规模数据 |
| 选择排序 | O(n²) | O(n²) | O(1) | 不稳定 | 交换次数少,适合数据量小 |
| 插入排序 | O(n²) | O(n²) | O(1) | 稳定 | 适合基本有序的数据 |
| 快速排序 | O(nlogn) | O(n²) | O(logn)(递归栈) | 不稳定 | 效率高,适合大规模数据,软考重点 |
| 归并排序 | O(nlogn) | O(nlogn) | O(n) | 稳定 | 适合大规模数据,需要额外空间 |
| 堆排序 | O(nlogn) | O(nlogn) | O(1) | 不稳定 | 适合求Top K问题,优先队列实现 |
⚠️ 核心提示:稳定排序(冒泡、插入、归并):相同元素排序后相对位置不变;不稳定排序(选择、快排、堆排):相同元素相对位置可能变化。
2. 查找算法(软考高频,记准对比)
| 查找算法 | 时间复杂度 | 适用场景 | 软考考点 |
|---|---|---|---|
| 顺序查找 | O(n) | 无序数组、链表 | 最简单,效率低 |
| 折半查找(二分查找) | O(logn) | 有序数组 | 必考,记准"有序"这个前提 |
| 哈希查找 | O(1)(平均) | 哈希表 | 考哈希冲突的解决方法(链地址法、开放定址法) |
排序与查找巩固题(软考真题+练习题)
- 下列排序算法中,时间复杂度为O(nlogn)且稳定的是( )
A. 快速排序 B. 归并排序 C. 堆排序 D. 选择排序
答案:B(解析:A、C不稳定;D时间复杂度O(n²))
- 下列查找算法中,要求数据必须有序的是( )
A. 顺序查找 B. 折半查找 C. 哈希查找 D. 所有查找算法
答案:B(解析:折半查找的前提是数据有序,否则无法进行二分)
八、软考数据结构核心总结(必背)
最后整理核心考点,帮你快速回顾,节省复习时间:
-
存储结构:重点记4种存储结构的对比,尤其是顺序和链式的区别。
-
线性表:顺序表和链表的操作复杂度,链表的3种类型。
-
栈和队列:栈的出栈序列、循环队列的假溢出,以及二者的应用场景。
-
字符串:子串个数计算,KMP算法的核心(next数组,不回溯主串)。
-
二叉树:3种遍历顺序、核心性质(叶子节点数=度为2节点数+1)、特殊二叉树的性质。
-
图:2种存储方式、2种遍历方式、2种最短路径算法的适用场景。
-
排序与查找:排序算法的复杂度、稳定性对比,折半查找的前提。
💡 备考建议:数据结构不用死记硬背,重点理解"为什么",结合题目巩固,尤其是真题,多做2遍就能掌握核心考点。
如果觉得这篇博客对你有帮助,欢迎点赞、收藏,祝各位小伙伴软考顺利通关!🎉