← 首页·文章列表

数据结构七 中测

一、数据结构基础概念

1. 数据结构三要素

数据结构研究的是数据的逻辑结构和物理结构及它们之间的相互关系。

2. 逻辑结构 vs 存储结构

易错辨析(判断题45、46):

3. 数据元素与数据项

4. 算法的特性与算法分析

5. 时间复杂度分析(通用方法)

基本方法:

  1. 找出执行次数最多的基本语句(通常是循环体内语句)。
  2. 写出基本语句执行次数关于问题规模n的函数。
  3. 取最高阶项(忽略系数和低阶项),得到大O复杂度。

常见复杂度举例:

(1) 对数阶 O(logₖn) 循环变量按几何级数增长。

(2) 平方阶/立方阶 多层嵌套循环,每层与n相关。

for (i=1; i<n; i++) {        // 外层 n-1 次
    y = y+1;
    for (j=0; j<=(2*n); j++)  // 中层 2n+1 次
        for (k=1; k<=3*n; k++) // 内层 3n 次
            x++;
}

执行次数 ≈ n × 2n × 3n = 6n³,复杂度 O(n³)。

(3) 线性阶 O(n) 单层循环与n成正比。

(4) 常数阶 O(1) 执行次数与n无关,如顺序表随机访问。


二、线性表

1. 顺序表(顺序存储)

2. 链表(链式存储)

3. 链栈操作

出栈操作(top为栈顶指针,s指向被删结点):

s = top;               // s保存栈顶结点
top = top->next;       // top后移

注意:顺序栈出栈则是先取元素再移动指针。

4. 顺序栈出栈操作

若栈顶指针top指向栈顶元素位置:

x = S->data[S->top];   // 先取出栈顶元素
S->top--;              // 栈顶指针下移

若top指向栈顶下一空位,则先top--再取元素。需注意题目的top指向约定。


三、栈与队列

1. 栈的基本概念

2. 出栈序列判断(通用方法)

对于入栈顺序固定的情况,判断某个出栈序列是否合法:

例1(第14题):出栈序列为 A,B,C,D(由栈顶到栈底),即实际出栈顺序为 D,C,B,A。

例2(第15题):入栈1,2,3,4,5,非法出栈序列是 45312。

例3(第17题):输入序列1,2,...,n,输出第一个是n,则输出序列是 n, n-1, n-2, ..., 1。

3. 栈的最小容量

若已知入栈和出栈序列,可模拟出栈过程,统计栈中最大元素个数即为最小容量。

例(第30题):进栈a,b,c,d,e,出栈c,e,d,b,a。

4. 循环队列核心公式

注意:数组大小为 A[0..m] 时,容量为 m+1。入队操作为 rear = (rear+1) % (m+1)。

5. 队列的基本概念


四、串

1. 串的定义

2. 子串与子串个数

3. 串的基本操作


五、数组与广义表

1. 数组的存储

2. 二维数组地址计算(通用公式)

(1) 按行优先存储 若行下标范围 r₁~r₂,列下标范围 c₁~c₂,行数 = r₂-r₁+1,列数 = c₂-c₁+1。 元素 a[i][j] 前面有: (i - r₁) × 列数 + (j - c₁) 个元素。

地址:LOC(a[i][j]) = 基地址 + [(i-r₁)×列数 + (j-c₁)] × 元素大小

(2) 按列优先存储 元素 a[i][j] 前面有: (j - c₁) × 行数 + (i - r₁) 个元素。

地址:LOC(a[i][j]) = 基地址 + [(j-c₁)×行数 + (i-r₁)] × 元素大小

例(第35题):A[0…8][1…5],4字节,A[0][1]地址=0。

注意:下标起始和数组基地址定义要看清(A[0][1]是第一个元素还是A[0][0]是第一个)。

例(第27题):A[10][10](下标0~9),按行优先,a[2][0]地址500,每个3字节,求a[3][3]。

3. 广义表


六、判断题易错总结

判断内容 正误 要点
数据的逻辑结构是指数据元素之间的逻辑关系 对 元素间关系,非数据项间关系
数据的逻辑结构是指各数据项之间的逻辑关系 错 同上
数据元素是数据的最小单位 错 数据项才是最小单位
数组一定是顺序存储的线性结构 对 数组是顺序存储的线性结构
串和数组都是线性结构 对 二者均属线性结构
链式存储方式可用于随机存储 错 链式存储只能顺序存取
共享顺序栈,当整个栈空间占满时才上溢 对 共享空间全部满才溢出
在栈中允许插入的一端称为栈顶 对 栈顶即操作端
空串就是由空格组成的串 错 空串无任何字符
串长度为串中不同字符的个数 错 是字符总个数,不是不同字符数

七、知识速记卡

  1. 时间复杂度:取决于问题规模和初态,对数阶看乘法/除法增长,立方阶看三层嵌套。
  2. 顺序表:插入移n-i+1,删除移n-i,平均移约n/2。
  3. 链栈出栈:s=top; top=top->next;。
  4. 循环队列:满(rear+1)%MAXLEN==front,空front==rear,个数取模。
  5. 出栈序列:模拟验证,大数出栈后小数必须逆序出。
  6. 数组地址:行优先(i×列数+j)×L,列优先(j×行数+i)×L,注意下标起止。
  7. 广义表:表头取第一个,表尾取剩余且必带括号。