栈、数组、队列、串
栈
定义:
删除和输入都在同一端的线性表,后进先出
顺序栈
定义一个线性表,用栈顶指针来控制栈元素的进出。
链式栈
定义一个头结点,一直指向栈顶,插入新结点时,更新头结点。优点:不会溢出,空间无限
共享栈
两个栈分别放在栈顶和栈底,存入的数据向中间靠齐。优点:节省存储空间。降低发生溢出的可能
应用
括弧匹配
左边的括号如:[ ,( , { 直接入栈,碰到右边的就和栈顶比,是否匹配。要是不匹配直接返回False
后缀表达式计算
数字直接入栈,碰到操作符,取出栈内的两个数字进行操作(如果是‘ / ’ ,拿出来是a,b的顺序就a/b)把结果再压入栈。操作完后,栈内的数字就是结果。
中缀表达式转后缀
碰到数字直接输出
碰到左括弧直接压入栈;
碰到运算符就比较栈顶的操作符,如果是低于该运算符的,就弹出栈输出。直到碰到左括弧,或者和自身同等级的运算符
碰到右括弧,就把左括弧上面的运算符全部输出,然后删除左括弧。
递归
递归就是借助栈来实现的,每一层递归,就是把上一次的信息存入栈中,然后到底的时候一层一层返回。(从递归到非递归,不一定要借助栈,递推也可以。如实现斐波那契数列)
队列
定义
先进先出
顺序结构
定义:数组+两个指针:front 头指针,rear尾指针 缺点:会出现假溢出
优化:循环队列
定义:顺序结构的优化,用取余运算使得逻辑上循环。
用来判断队空队满的方法:
1、尾指针指向队尾元素的后一位,即当(尾指针+1)%Size==头指针时,队满
2、用Size来判断是否队满。Size计算:(头指针+Size-尾指针)%Size
3、当头指针===尾指针的时候,加一个tag,来判断是队空还是队满
优点:不会出现假溢出
链式结构
定义:即带一个头指针和尾指针的单链表。
优点:不会溢出,空间理论上无限。
双端队列
定义:对于队列的输入输出做改变,在原有的一头进一头出,改成一头出两头进,两头进一头出,两头出两头进
队列的应用
层次遍历:即BFS,树的层次和图的广搜都需要。即读入一个点,把该点以及该点相连的点都放入队列中,输出点。重复直到队列为空
在计算机系统的应用:缓冲区、CPU进程调度
数组
数的存储
一般会考的就是计算某个地址的存储结构,需要区分是行优先存储,还是列优先存储。
特殊矩阵的压缩存储
(做题时需要注意下标,存储的一维矩阵是从0还是1开始存储。被压缩矩阵是从0还是1还是存储)
对称矩阵:上三角==下三角,计算时把图画出,慢慢推
三角矩阵:方法同对称矩阵
三对角矩阵:也称带状矩阵,对于元素aij,当|i-j|>1时,均为0。故除了第一行和最后一行仅有两个元素存储,其他行有三个元素存储
稀疏矩阵
用三元组(i,j,value)或者十字链表存储。
串
简单模式匹配算法
复杂度:O(n^2),纯暴力
匹配主串中所有与模式串相同长度的子串,一一对边,如果找到就返回子串的第一个元素在主串的位置。
KMP算法
复杂度:O(n+m) (n为主串长度,m为模式串长度)
对暴力匹配算法做了优化,当字符失配的时候,i(指向主串中当前失配的字符)不同,j(指向模式串中当前失配的字符)移动到next[j],处理为O(1),使得i不会重复匹配,走回头路。复杂度降为O(n)。next数组为next[j]为当前j失配时,根据前面已经匹配到的信息,直接跳转到下一个可匹配的位置。(详见图,文字描述属实苍白)
调整
next数组:
见图
nextval数组:
对next数组的优化,如果 str[next[j]] = str[j],则next[j]=next[next[j]]。(由于前面是递推过来,故只需要一次即可)
标签:括弧,存储,队列,矩阵,next,数组,408,指针 From: https://www.cnblogs.com/yxdsTutorial/p/17397157.html