重学数据结构笔记(2)

4.栈和队列
栈(stack),是仅限定在表尾进行插入和删除操作的线性表 (一种特殊的线性表,有前驱后继关系)
我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的称为空栈,栈又称为先进后出的线性表简称LIFO结构
先进后出,后进先出,最先进栈的元素不一定最后出,因为栈对元素的删除和增加位置有了限制,可时间没限制
例子:1,2,3依次放入栈中,可能是 1进 1出 2进 2出 3进,3出 所以进栈顺序是123出栈顺序也是123,其他情况相似。但是一定不会有312出栈顺序(自己想为什么,很重要!)

栈的顺序存储结构
既然栈是线性表的特例,那么栈的顺序存储结构其实也是线性表存储结构的简化。我们叫他线性栈(可用数组实现,下标0为栈底,定义一个指向最上元素的指针)
两栈共享,一个栈满溢出,一个栈没用完,两栈合成一个数组,两个栈底分别做数组的头尾,向中间靠拢,用得少,缺点明显,适合此消彼长的情况。

栈的链式存储结构
简称,链栈
如果栈在使用过程中元素变化不可预料,时大时小,推荐用链栈,变化在可控范围内用顺序栈。
栈的应用----递归,我们把一个直接或间接调用自身的函数,叫递归函数
写递归最怕陷入无穷的循环中,所以每个递归函数都要有至少一个跳出递归的条件
栈的应用----逆波兰表达式,数学表达式计算机无法根据运算规则运算,所以发明了计算机可以用来运算的数学表达式表达方法,也叫后缀表达法
例:9+(3-1)*3+10/2 ; 用后缀表达法写 9 3 1 - 3 * + 10 2 / + ; 根据运算顺序,一次把运算符号放在数字后面
计算机计算后缀式,将后缀表达式从左至右压入栈,先压入数字 931,再压入运算符“-”号,此时将13出栈进行减法操作再入站,以此类推(不详细说了)

队列,只允许在一端进行插入操作,另一端进行删除操作的线性表。
队列是一种先进先出(first in first out)的线性表,简称FIFO,允许插入的一端称为队尾,允许删除的一端称为队头。(像小学生站一排)
线性表有顺序和链式两种存储方式,栈作为特殊的线性表也有相应的链式和顺序存储方式,队列也是线性表,所以也有链式和顺序两种存储方式
队列的顺序存储结构,与线性表一样,在数组下标为0的地方是队头,依次在后面追加元素,这时时间复杂度是O(1),但是如果删掉队头,就必须把后面的前移,让0处有头,所以此时时间复杂度为O(n)
即使在队头队尾用上指针,由于数组大小是初始化就决定的,是固定的,所以或出现 溢出 错误,所以,为了解决这个问题,我们把队列头尾相接,这种顺序的存储结构叫循环队列

怎样计算队列有没有满,计算队列长度公式:(rear - front + QueueSize) % QueueSize
队列的链式存储结构,其实就是线性表的单链表,只不过只能头删除,尾插入,简称链队列。(比单链表操作简单,毕竟只需要考虑头尾的操作)

对比链队列和循环队列,基本操作的时间复杂度都是O(1),不对循环队列先申请好空间,使用期间不释放,而链队列每次申请和释放节点也需要时间,如果出入队频繁,两者还是有细微差别
对于空间来说,循环队列创建固定空间,容易造成浪费和溢出,链队列不存在这个问题,虽然指针也会占用一点空间,不过相对循环队列更灵活。两者根据情况选择
总结,栈和队列都是特殊的线性表,只是在插入和删除上做了限制。
--------------栈------------------------------队列------------
--顺序栈--共享栈--栈链------顺序队列--循环队列--链队列--

时间: 2024-10-24 21:24:28

重学数据结构笔记(2)的相关文章

重学数据结构笔记

大学上数据结构课都逃了,后来发现其重要,期间又自己抱起书学了一遍,因为当时懒,自学的成果也不大,如今工作有一年了,也写过几个项目越来越感觉数据结构对个人思想的重要,如今趁裸辞的空窗期,好好恶补下,顺便写个笔记总结下.仅为个人笔记用所以不排版写到哪算哪. 1,数据结构,是相互之间存在一种或多种关系的数据元素的集合从不同角度讨论,有不同的分类物理结构:顺序存储结构,链式存储结构逻辑结构:线性结构,集合结构,树形结构,图形结构2.数据类型,是指一组性质相同的值得类型的集合以及在此集合上的一些操作抽象数

重学数据结构笔记(3)

5.串,由零个或多个字符组成的序列,又叫字符串串的比较是通过组成字符串的字符之间的编码来进行的,而字符串编码指的是字符在对应字符集中的符号.串的存储结构与线性表相同分两种串的顺序存储结构串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的.按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区域,一般使用定长数组来定义串的顺序存储方式其实是有问题的,因为串的插入和替换都会引起长度超过数组长度.串的链式存储结构,与线性表链式存储结构相似,不过每个节点存一个字符,太浪费空间,可以一

重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)

平衡树 1.定义 对于每个结点,左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们按照1-n的顺序插入到二叉排序树中,那么二叉排序树就退化成了一个有序链表,效率大大降低. 2.有关概念 所有平衡树基本由以下三个特征组成: 1.自平衡条件 2.旋转操作 3.旋转的触发 平衡树通过设置合理的自平衡条件,使得二叉排序树的查找.插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找.插入等操作时进行判断,如果满足其中某个旋转的触发条件,则

重学数据结构 --- 分类+稀疏数组

一.数据结构的分类 1. 数据结构两大类 线性结构和非线性结构 1) 线性结构 线性结构是最常见的数据结构,特点是元素间存在一对一的线性关系. 线性结构又分两种,一种是顺序存储(称为顺序表),另外一种是链式存储(称为链表).顺序表中的存储元素的连续的.链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息. 常见的线性结构有:数组.队列.链表和栈(这里只是讲个大概,具体内容后面的文章会展开阐述). 2) 非线性结构 非线性结构就是结点元素可能存在多个直接前趋和多个直接后续(

C#&java重学笔记(函数)

C#部分  1.写在函数定义的()中的关键字: a.params关键字:用来满足函数的参数为数组时,而数组的长度不固定的情况.且该关键字只能用来修饰数组型参数.这样一修饰,就达成了类似JavaScript函数书写参数的特点. b.ref关键字:让参数按引用传递,类似于C中的传指针参数.比如经典的数值交换函数,你传形参和传指针的结果应该知道,加了ref关键字就相当于传指针.注意:ref只接收变量做参数,你字面量怎么弄指针?而且该变量必须初始化!     c.out关键字:功能和ref一样,区别在于

C#&java重学笔记(面向对象)

C#部分 1.C#有一个internal关键字,指字段可以同一个程序集中访问,出了程序集不行.还有一个protected internal(没有先后之分)修饰词,指只能在同一个程序集中的子类访问 2.abstract和virtual修饰词: abstract用来修饰类和方法,表 抽象.抽象类中的方法可以不抽象,但是抽象方法所在的类必抽象.且抽象方法不得被实现,即不能用{}表示函数体.而且抽象类只有被继承才能体现它的作用,同时子类必须override父类的抽象方法!      virtual用来修

C#&java重学笔记(泛型)

C#部分: 1.泛型的出现主要用于解决类.接口.委托.方法的通用性,通过定义泛型类.接口.委托.方法,可以让不同类型的数据使用相同运算规则处理数据,方便了开发. 2.利用System.Nullable<T>泛型可以生成可空的值类型变量,值类型的可空泛型可以简写为关键字加问号,如:int? val=new int?(); 3.关于布尔类型的泛型可空& |操作,我们可以知道,如果关心不关心操作数是否为空就能得出结果,那么空值就是无所谓的. 4.可空的泛型值类型的HashValue属性值为t

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

重学线代——声明篇

为啥重学线代呢? 1.当初学得模棱两可,时间长了啥也没剩下 2.越来越发现线代很流弊,很有用(不只是线代,各门数学都有此感触) 3.比较巧合地在网络上发现了个很好的线代教学资源 4.假期浪费了太可惜了 你这堆博客要写点啥呢? 课程笔记.个人领悟.无知吐槽.等等等等 你还想说点啥么? 没了 哦 恩