目录
一、栈
1.定义(informal)
操作受限的线性表,只能在一段进行插入删除(入栈出栈)
2.术语
栈顶、栈底、空栈
3.特点
后进先出LIFO
4.基本操作
创建销毁、入栈出栈、读取栈顶元素、判空判满
二、顺序栈
1.定义
利用顺序表实现
2.基本操作
(1)初始化
top=-1
(2)入栈
top先++再赋值
(3)出栈
先存值再--
(4)读取栈顶元素
出栈操作,top不动
(5)判空
top==-1
(6)判满
top == MaxSize - 1
3.区别S.top==0
(1)初始化
top==0
(2)入栈
先入栈后++
(3)出栈
先--后存值
(4)读取栈顶元素
同
(5)判空
top==0
(6)判满
top == MaxSize
三、共享栈
1.定义
两个逻辑栈共享一个存储栈空间
2.操作
(1)定义结构
顺序表+两个指向
(2)初始化
两个指针,top0指向最左面ele前面,top1指向最右面ele后面
(3)判满
top0 + 1 == top1
四、链栈
1.定义
单链表实现,操作受限,只能进行头插、头删
2.操作(带头结点)
(1)初始化
申请头结点空间,赋null
(2)入栈
将元素e入栈LS,头插
(3)出栈
出栈,存储元素为e,头删
(4)读取栈顶元素
(5)判空
LS->next == NULL
3.区别:不带头结点
理解:无头结点,头指针直接指向第一个结点,因为是头指针,so不能使用next属性
(1)初始化
头指针==null
(2)入栈
分两种情况,case1空栈,让入栈的结点next指向null,头指针赋值成该指针;case2非空,指针1指向第一个结点,新结点指向第一个结点,将头指针指向新结点
(3)出栈
指针指向第一个结点,next指向L,L就指向第二个结点了,free第一个结点
五、队列(循环队列)
1.定义
操作受限的顺序表,头部入队尾部出队,静态arr实现。
实现顺序表之后,发现这个队列只能使用一次,so使用取模操作可以使front和rear回到开头,在逻辑上变成了一个循环队列
2.术语
队头、队尾、空队列
3.特点
先进先出FIFO
4.操作
(1)初始化
两个指向,赋值为0,表示都在队尾(此时队尾也是队头)
(2)入队
将元素e入队
rear下标处赋值,之后rear++
变成循环队列之后入队,rear= (rear+1)%MaxSize
(3)出队
出队,元素存在e中,front++
变成循环队列之后出队,front= (front+1)%MaxSize
(4)读取队头元素
元素存在e中,front不变
(5)判空
front==rear
(6)判满
错误:rear==MaxSize
reason:当队满了之后rear==MaxSize,但出队之后rear不动即rear==MaxSize依然成立,但是不是满的
解决办法:取模,到了最大就回归0点
so:逻辑上变成了循环队列
so当(rear+1)%MaxSize ==front即可,此时会浪费一个空间,否则判满与判空条件相同
(7)计算队列长度
(rear+MaxSize-front)%MaxSize
attn:链队不能这么计算
5.不想浪费一个空间
(1)size
1)思路
初始化的时候设置size属性,记录即时arr的长度,即判断条件变成了arr长度和MaxSize的比较
2)操作
a)定义
b)初始化
c)入队
d)出队
e)判空
f)判满
g)输出队列
(2)tag
1)思路
初始化的时候设置tag属性,进行删除操作tag赋值0,插入操作tag赋值为1,因为仅有插入才有可能满队,so满的条件为front == rear && tag == 1
2)操作
a)定义
b)初始化
c)入队
d)出队
e)判空
f)判满
g)输出队列
6.区别:初始化时rear指向的ele位置
rear可以指向0,也可以指向-1,即第一个结点后面
六、链队列
1.定义
两端受限的单链表实现
2.基本操作(带头结点)
(1)初始化
(2)入队
(3)出队
(4)获取队头元素
(5)判空
七、双端队列
1.定义
两端都可以进行入队出队的队列
2.受限分类
(1)入队受限
一端可以入队出队,另一端只能出队
(2)出队受限
一端可以入队出队,另一端只能入队
3.考点
选择题,给待输入的ele,问(不)可能输出的序列
八、栈应用
此部分要求会手算和模拟机算,会伪代码
1.括号匹配
判断使用括号是否合法,判断步骤:
step1:从左->右依次扫描, 左括号入栈
step2:if是右括号,弹栈,比对是否成对,成对继续扫描,不成对直接false
step3:if到最后右括号栈为null,or到了最后栈不为null,则为false
2.表达式求值
(1)前中后缀表达式介绍
要求会手写计算,相互转换并求值
(2)中<->后
1)中->后
手算计算步骤:
从左向右扫描,找到最先可以运算的符号,将两侧数字提出,运算符放最后,运算完之后看作一个大的数字
“左优先“原则:if有左右同时可以计算的运算符,则优先计算位于左面的运算符
eg:
可用序号检验:顺序相同
2)后->中
步骤:
利用栈,从左->右,将数字入栈,遇到运算符弹栈,先弹出的放右边,运算之后入栈
eg:
(3)中<->前
1)中->前
步骤:(与中->后顺序相反)
从右->左遍历,依次找运算符的先后顺序,符号放在运算符前
右优先原则
eg:
2)前->中
步骤:
利用栈,从右向左扫描,将数字入栈,遇到运算符弹栈,先弹出的放左边,运算之后入栈
eg:
(4)后缀求值
按照后->中步骤走
(5)中缀求值
中->后+后计算
(6)理解
中->后/前目的就是去掉括号,因为括号会使计算机不知道先后顺序,so计算中缀表达式就是先去括号再还原回来的过程,只是在还原过程中计算机知道了计算的顺序,顺便就把式子计算了
3.递归
在递归中,最后调用的函数会最先返回值回来,so在递归的应用中使用到了栈
九、队列应用(后期详细介绍)
1.遍历
(1)树的层次遍历
将树按行从左->右遍历
(2)图的广度优先遍历
2.OS
先来先服务(FCFS)
(1)cpu资源分配
当打开多个app时,按照先后顺序,先打开的先cpu处理
(2)打印数据缓冲区
当使用打印机时,OS会在主机上创建打印数据的缓冲区,在打印文件时将待打印的文件放入打印数据缓冲区
十、矩阵的压缩存储
目的:节省内存空间
考点:出选择题,矩阵->一维arr中k与i,j的关系
1.arr的存储结构
(1)一维arr
(2)二维arr
1)行优先存储
一行一行存
2)列优先存储
一列一列村
3)示意图
数组下标一般从0开始
2.特殊矩阵
主要考察矩阵->一维arr,k i j 之间的关系
做题步骤:
step1:画示意图,确定是按照行优先还是列优先
step2:确定每行or每列的个数
step3:sum
(1)对称矩阵
ai,j == aj,i
上三角矩阵or下三角矩阵
(2)三角矩阵
上三角矩阵or下三角矩阵,其他地方都是一个常数
(3)三对角矩阵
|i-j|>1的地方全为0,so一行最多3个ele
(4)稀疏矩阵
矩阵中有的地方有ele,有的地方没有
so用三列表or十字链表表示
1)三元组线性表
下标行、列、值
2)十字链表法(chap6详解)
矩阵一般从0开始