![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构笔记
文章平均质量分 50
rainbow小现
这个作者很懒,什么都没留下…
展开
-
数据结构笔记8-朴素模式匹配算法和KMP
方法:对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止。它是在计算出next值的同时,如果a位字符与它next值指向的b位字符相等,则该a位的nextval。T串(子串)各个位置j值的变化定义为一个数组的next,next的长度就是T串的长度。就指向b位的nextval值,如果不等,则该a位的nextval值就是它自己a位的next的值。2)模式串的最后一位字符不影响next数组的结果。子串的定位操作称为串的模式匹配。原创 2023-01-07 22:33:31 · 86 阅读 · 0 评论 -
数据结构笔记8-串
一个结点存多少字符很重要,串的链式存储除了在连接串与串操作时有一定方便之外,总的来说,不如顺序存储灵活,性能也不如顺序存储结构好。例如:字符串"software"8个字符,可是设置间隔位置有9个,即有36个字串,别忘了,空串也是子串,所以最后一共37个子串。2)在计算机中存在一个自由存储区,叫"堆",这个"堆"可由C语言的动态分配函数malloc()和free()来管理。字符串的字串,就是字符串中某个连续片段。用一组地址连续的存储单元来存储串中的字符序列的。空格串:只包含空格的串,有长度,可不止一个空格。原创 2023-01-07 22:09:22 · 78 阅读 · 0 评论 -
数据结构笔记7-队列
注意:有关循环队列,关于对头队尾指针的指向,多数教材约定,队头指针指向队头元素的前一位置,队尾指针指向队尾元素,也有教材规定队头指针元素,队尾指针指向队尾元素的后一位置。2)删除时:头出法,且遵循头改,尾不改,但当删除最后一个元素时,首尾都要改。队列是一种先进先出(FIFO)的线性表,允许插入的一端为队尾,允许删除的一端为队头。引入两个指针,front指队头,rear指队尾元素的下一个位置。出队列:在队头,保证下标为0的位置不为空,时间复杂度O(n)。1)插入时:尾插法,且遵循尾改,头不改。原创 2023-01-07 21:49:06 · 255 阅读 · 0 评论 -
数据结构笔记6-栈的应用之前中后缀part2
1)w为一般操作符(+,-,*,/),要与栈顶操作符比较优先级,若w优先级高于栈顶操作符,则入栈;3)w为右括号,操作符栈依次退栈并进入到结果,直到碰到左括号为止,左括号退栈不进入结果,右括号也丢掉,达到结果中消除括号的目的。2、还可以,就根据平时的计算,只不过后缀就把符号放字母后面,把这块看成一个整块,然后继续计算,符号放后;4)w为‘#’,表示中缀表达式结束,操作符栈中元素依次退栈进入到结果,直至碰到‘#’,退栈,整个操作结束。2.将运算符移到相应的括号后:(8((35)+(5(62)/)-)*)—原创 2023-01-06 22:23:02 · 251 阅读 · 0 评论 -
数据结构笔记6-栈的应用之前中后缀part1
4)当操作符栈不为空时,弹出栈顶操作符(opera tor), 同时从操作数栈中弹出栈顶操作数(右操作数right)和次栈顶操作数(左操作数left),计算left operator right,并将结果压入操作数栈中。请注意:前缀表达式和后缴表达式操作数的顺序是相同的,但是因为求值从不同方向扫描,所以在后缀表达式求值中,中缀表达式和后缀表达式中数字之间的相对位置是没有改变的,如2+3*4,234*+。计算后缀表达式和前缀表达式的时间开销是O(n),其中n是表达式中字符的个数。当前函数返回的情形。原创 2023-01-06 22:15:22 · 58 阅读 · 0 评论 -
数据结构笔记6-递归与迭代
当问题的定义是递归、数据结构是递归的和问题的解法是递归的时,最好利用递归。递归过程的实质是将复杂问题分解成若干子问题,子问题与原问题具有相同特征,但是简单了。基本项描述了递归过程的一个或几个终结状态,即不需要继续递归就可求值的状态。即将复杂问题化为较简单的问题,而简单问题与复杂问题的形式是一样。递归使用选择结构,可以使程序的结构更清晰、更简洁、更易理解,但大量递归调用会建立函数的副本,会耗费大量的时间和内存。递归算法的设计实际上就是对问题进行抽象的过程,如果抽象到每个小问题都有想用特征,就形成了递归。原创 2023-01-06 21:04:50 · 95 阅读 · 0 评论 -
数据结构笔记5-栈
使用这样的数据结构,通常都是当两个栈的空间需求有相反关系,也就是一个栈增长时,另一个栈在缩短的情况。链栈的进栈push和出栈pop没有任何循环操作,时间复杂度均为O(1)。对于空栈来说,链表的原定义是头指针指向空,故top=NULL的时候。栈的进栈、出栈都没有涉及任何循环语句,因此时间复杂度均为O(1)。有n个数顺序依次进栈,出栈序列有Cn种,卡特兰数,这个挺重要的。把栈顶放在单链表的头部,对于链栈来说,是不需要头结点的。栈的插入操作,叫进栈、压栈、入栈。栈的删除操作,叫做出栈、弹栈。原创 2023-01-06 20:39:58 · 95 阅读 · 0 评论 -
数据结构笔记4-链表
思路:用一个临时指针变量指向当前结点的下一个结点,然后删除当前结点,接着将临时指针指向的结点作为当前结点,重复上述过程直到所有结点均被删除为止。即下标为0的元素的cur就存放备用链表的第一个结点的下标,(未被使用的数组元素称为 备用链表)。注意:在链表的第p个位置上插入一个元素的含义我们假定是,该插入操作完成后新结点在链表中 的位置是p。头插法生成的是逆序的,尾插法生成的是顺序的。即最后一个的cur存放第一个有数值的元素的下标,相当于头结点作用,space[0].cur为头指针。原创 2023-01-06 18:22:53 · 309 阅读 · 0 评论 -
数据结构笔记3-线性表
4、假设p是指向线性表第i个元素的指针,则该结点ai的数据域可以用p->data,p->data的值是一个数据元素,结点ai的指针域可以用p->next来表示,p->next的值是一个指针。实现方法:初始化为某个固定大小的数组,一旦数组变满就重新创建一个大小是原来大小两倍的新数组,类似地,一旦数组中的元素个数少于数组大小的一半就重新创建一个大小是原来大小一半的新数组。,若链表有头结点,则是指向头结点的指针,无论链表是否为空,头指针均不为空,是链表的必要元素。线性表的长度:线性表中的数据元素的个数。原创 2023-01-05 18:34:13 · 58 阅读 · 0 评论 -
数据结构笔记2-数据类型和时间复杂度
程序运行时所需输入的数据总量,对源程序进行编译所需时间,计算机执行每条指令所需时间,程序中指令重复执行的次数。在分析算法的时间复杂度时,有时需要估算基本操作的原操作,它是执行次数最多的一个操作,该操作重复执行的次数称为 频度。例如,整型数组是由若干整型数据组成的。4、好的时空性能:指的是运行时间短、占用内存少,一般情况下会取折中,一般很难做到两全其美。常数阶:与问题的大小无关,执行时间恒定的算法,称之为 具有O(1)的时间复杂度。数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。原创 2023-01-05 16:41:26 · 91 阅读 · 0 评论 -
数据结构笔记1-基本概念和存储结构
除数据元素存储在一个地址联系的存储空间外,尚需建立一个索引表,索引表的索引项指示存储节点的存储位置(下标)或存储区间端点(下标非稠密索引),兼有静态和动态特性。插入、删除效率差:因为在插入/删除一个元素时候,需要移动此数据后面的所有数据,若是删除最后几个还好,要是删除的是前几个,那需要移动的数据就很多了。数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。数据元素顺序存放,每个存储节点只含一个元素。数据对象:简称数据,是性质相同的数据元素的集合,是数据的子集。原创 2023-01-05 13:35:04 · 111 阅读 · 0 评论 -
for循环的i--,循环体不执行时候,i--也不执行
for 循环的一般形式为:for(表达式1; 表达式2; 表达式3){ 语句块}它的运行过程为:1) 先执行“表达式1”。2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。3) 执行完循环体后再执行“表达式3”。4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。 “表达式1”仅在第一次循环时执行,以后都不会再执行...原创 2022-04-01 14:58:34 · 5145 阅读 · 0 评论