文章目录
- 4、栈和队列
- 4.1、栈的定义
- 4.2、队列定义
- 5、串、数组、矩阵和广义表
- 5.1、串
- 5.2、 数组
- 5.3、稀疏矩阵
- 5.4、广义表
4、栈和队列
4.1、栈的定义
线性表是具有相同数据类型的n个数据元素的有限序列, n为表厂。n=0时 线性表是一个空表 L = (a1,a2,a3,…an)
栈是只允许在一端进行插入或删除操作的线性表
栈顶 允许插入和删除的一端 栈顶进 栈顶出
栈底 不允许插入和删除的一端
4.2、队列定义
队列是一种先进先出的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端称为队尾。允许删除元素的一端称为队头。
队尾插入 队头删除
队空条件 head = tail
队满条件 (tail + 1) % size = head
循环队列
输出受限的双端队列是指元素可以从队列的两端输入, 但只能从队列的一端输出 。如果有e1,e2,e3,e4 依次进入输出受限的双端队列 。 则得不到的输出序列是__B
A e4 e3 e2 e1 B e4 e2 e1 e3
C e4 e3 e1 e2 D e4 e2 e3 e1
A. e4 e3 e2 e1:这是可能的。假设所有元素都从同一端输入,然后按相反顺序输出。
B. e4 e2 e1 e3:这是不可能的。因为e2和e1的输出顺序表明它们是从同一端被插入的,但是随后e3出现在了最后,这在输出受限的双端队列中是不可能的,除非e3是在e2和e1之后从另一端插入的,但这又违背了e4最先输出的前提。
C. e4 e3 e1 e2:这是可能的。e1和e2可以分别从不同端输入,而e3和e4从同一端输入,从而实现这种输出顺序。
D. e4 e2 e3 e1:这也是可能的。e1、e2、e3可以从不同的端口以适当的顺序输入,然后从同一端口按照此顺序输出。
5、串、数组、矩阵和广义表
5.1、串
串是由 字符构成的有限序列 是取值范围受限的线性表。 一般记为 S = a1 a2 … an 其中 S是串名 a1 a2 an是串值。
空串 长度为零的串 空串不包含任何字符。
空格串 由一个或多个空格组成的串
子串 由串中任意长度的连续字符构成的序列 含有子串的串称为主串。 子串在主串中的位置 指子串首次出现时,该子串的第一个字符在主串中的位置。空串是任意串的子串。
串相等 两个串长度相等 且对应位置上字符相同
串比较 两个串比较大小 以字符的ASCII码值作为依据 比较操作从两个串的第一个字符开始进行 ,字符的ASCII码值大者所在的串为大。 若其中一个串先结束,则以串长较大者为大。
对串的操作有以下几种
(1) 赋值操作 将串t的值赋给 串s
(2) 连接操作 将串t连接在串s的尾部 形成新串
(3) 求串长 StrLength(s) 返回串s的长度
(4) 串比较 StrCompare(s,t) 比较两个串的大小
(5) 求子串SubString(s, start , len)返回 串s从start开始 长度为len的字符序列
串的存储结构
(1) 串的顺序存储 定长存储结构
(2) 串的链式存储 块链
子串的定位操作通常称为串的模式匹配, 它是由各种串处理系统中最重要的运算。 子串也称为模式串
5.2、 数组
数组类型存储地址计算
一维数组 a[n] a[i]存储地址 a+i* len
二维数组 a[m] [n]
a [i] [j]的存储地址为按行存储 a+ (i*n + j) * len
a [i] [j]的存储地址 按列存储 a + (j * m + i) * len
已知5行5列的二维数组a 中各元素占2个字节 求元素 a[2] [3] 按行优先存储的存储地址?
a + (2 * 5+ 3) *2 = a +26
5.3、稀疏矩阵
上三角矩阵 矩阵中下标i和 j的元素 对应一维数组下标
(2n - i + 1)* i /2 + j
下三角矩阵 下标为i 和 j的元素 对应一维数组下标
(i+ 1)*i/2 + j
不要硬背公式 可以带入法计算
设下三角矩阵 A[0…8, 0…8] 将该三角矩阵的非零元素 按行优先压缩存储在数组 M [1…m] 中,则元素A[i,j]
(0<= i <= 8 , j<= i)存储在数组M的 ___A中
A M[i(i+1)/2 + j + 1] B M[i(i+1)/2 + j ]
C M[i(i-1)/2 + j ] D M[i(i-1)/2 + j + 1]
代入 A[0, 0] = M [1] 排除C A[1, 0] = M[2] 排除 B D
5.4、广义表
广义表是n个表元素组成的有限序列 是线性表的推广。
通常用递归形式定义 读作 LS = (a0,a1, …, an)
n是 广义表的长度 (最外层包含的元素个数)
n = 0的 广义表为空表 而递归定义的重数就是 广义表的深度
取表头 head(Ls) 取表尾tail(Ls)
Ls = (a, (b,c), (d,e))
head(Ls) = a tail (Ls) = ((b,c),(d,e))
有广义表 Ls = (a, (b,c), (d,e)) 长度为? 深度为? 3, 2
有广义表Ls = (a,(b,c), (d, e)) 若将其中的b 字母取出操作为?
head(head(tail(Ls)))