首页 > 其他分享 >栈、数组、队列、串(408)

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

时间:2023-05-13 13:13:32浏览次数:45  
标签:括弧 存储 队列 矩阵 next 数组 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]]。(由于前面是递推过来,故只需要一次即可)

标签:括弧,存储,队列,矩阵,next,数组,408,指针
From: https://www.cnblogs.com/yxdsTutorial/p/17397157.html

相关文章

  • 正确使用php开发系列:判断数组的key是否存在
    背景:我们习惯上使用!empty($data['data']['list']判断数组$data里有没有key为list的元素,正确判断key是否存在的方式应该使用array_key_exists 为什么不要使用!empty($data['data']['list'],因为当list不存在时,会报错!......
  • 【数组01】二分查找&移除元素
    TableofContents二分查找704.二分查找35.搜索插入位置34.在排序数组中查找元素的第一个和最后一个位置69.x的平方根367.有效完全平方数移除元素27.移除元素26.删除排序数组中的重复项283.移动零844.比较含退格的字符串977.有序数组的平方Solutions7......
  • 剑指 Offer 04. 二维数组中的查找
    剑指Offer04.二维数组中的查找题目描述在一个n*m的二维数组中,每一行都按照从左到右非递减的顺序排序,每一列都按照从上到下非递减的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。0<=n<=10000<=m<=1000解法1......
  • 剑指 Offer 03. 数组中重复的数字
    剑指Offer03.数组中重复的数字题目描述找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。2=n<=100000解法1.先进行......
  • 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你
    2023-05-12:存在一个由n个节点组成的无向连通图,图中的节点按从0到n-1编号,给你一个数组graph表示这个图,其中,graph[i]是一个列表,由所有与节点i直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重......
  • 树状数组--动态维护区间操作
    树状数组(二元索引树/二元下标树/BinaryIndexedTree,BIT/FenwickTree):树状数组虽名为数组,但从其英文名(BinaryIndexedTree)可看出它本质上是一种被表达为树的数据结构。对于大小为n的序列nums,最基本的树状数组以O(logn)时间复杂度同时支持如下两种操作。1)更......
  • Radis--消息队列
    引用:消息队列_哔哩哔哩_bilibili 1.消息队列的概念: 2.消息队列的工作机制: 注:Broker也可主动推送给consumer.3.Redis--MesssageQueue4.Redis--Pub/Sub5.Redis--Stream......
  • 5、栈、队列、优先队列
    内容来自刘宇波老师玩转算法面试1、栈的基础应用20-有效的括号publicstaticbooleanisValid(Strings){Stack<Character>stack=newStack<>();char[]chars=s.toCharArray();for(charc:chars){if(c=='('||c=='{'|......
  • 1887. 使数组元素相等的减少操作次数
    1887.使数组元素相等的减少操作次数给你一个整数数组nums,你的目标是令nums中的所有元素相等。完成一次减少操作需要遵照下面的几个步骤:找出nums中的最大值。记这个值为largest并取其下标i(下标从0开始计数)。如果有多个元素都是最大值,则取最小的i。找出num......
  • 在C#中使用默认值初始化字符串数组的3种方式
    在本文中,您将学习到新建字符串数组如何设置默认值。数组是可以使用索引访问的相同类型的元素的集合。对于字符串数组,每个元素都是一个字符串值。在C#中创建新的字符串数组时,默认值为null。但是,在某些情况下,您可能希望使用特定的默认值而不是null初始化字符串数组。例如,希望A......