栈、数组、队列、串(408)

栈、数组、队列、串

定义:

删除和输入都在同一端的线性表,后进先出

顺序栈

定义一个线性表,用栈顶指针来控制栈元素的进出。

链式栈

定义一个头结点,一直指向栈顶,插入新结点时,更新头结点。优点:不会溢出,空间无限

共享栈

两个栈分别放在栈顶和栈底,存入的数据向中间靠齐。优点:节省存储空间。降低发生溢出的可能

应用
括弧匹配

左边的括号如:[ ,( , { 直接入栈,碰到右边的就和栈顶比,是否匹配。要是不匹配直接返回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]]。(由于前面是递推过来,故只需要一次即可)

posted @ 2023-05-13 12:55  dueyu  阅读(46)  评论(0)    收藏  举报