企业官方网站怎么写中国外贸人才网官网
企业官方网站怎么写,中国外贸人才网官网,沈阳网站优化公司,网站建设公司业务在哪里来栈
一、栈的定义
栈是(stack)是限定尽在表尾进行插入和删除操作的线性表。 栈又称为后进先出#xff08;Last In First Out#xff09;的线性表#xff0c;简称LIFO结构。
二、进栈出栈变化形式
注意#xff1a; 并不是最新进栈的元素只能最后处栈。如#xff0c;我们…栈
一、栈的定义
栈是(stack)是限定尽在表尾进行插入和删除操作的线性表。 栈又称为后进先出Last In First Out的线性表简称LIFO结构。
二、进栈出栈变化形式
注意 并不是最新进栈的元素只能最后处栈。如我们现在有三个元素一次进栈次序会有以下5种 1. 1、2、2进再3、2、1出出栈次序为321 2. 1进1出2进2出3进3出出栈次序为123 3. 1进2进2出1出3进3出出栈次序为213 4. 1进1出2进3进3出2出出栈次序为132 5. 1进2进2出3进3出1出出栈次序为231。
三、栈的顺序存储结构及实现
一栈的顺序存储结构 栈是线性表的特例栈的顺序存储结构也是线性表存储结构的简化。线性表是用数组实现的用下标为0的那一端作为栈底使栈变化最小。 我们定义一个top变量来指示栈顶元素在数组中的位置。若存储栈的 长度为StackSize则栈顶位置top必须小于StackSize。当栈存在一个元素时top0.因此通常把空栈的判定条件定位top-1.
进栈push出栈pop。就像子弹的压和弹。 没有涉及循环两者的时间复杂度均为1.
两栈共享空间两个类型相同的栈则可以共享存储空间。让一个栈的栈底为数组的始端即下标为0处另一个栈为数组的末端即下标为数组长度n-1处。这样两个栈如果增加元素就是两端点向中间延伸。两个栈见面之时也就是两个栈指针相差1即top11top2为栈满。
二栈的链式存储结构 栈的链式存储结构简称为链栈。 链栈的栈顶和单链表的头指针重合不需要头结点。 对于链栈来说不存在栈满的情况除非内存已经没有可以使用的空间。如果真的发生就是操作系统已经面临死机崩溃的情况而不是这个链栈是否真的溢出。 对于空栈来说链表原定义是头指针指向空那么链栈的空其实就是topNULL的时候。
对比顺序栈和链栈它们在时间复杂度上是一样的均为O(1)。对于空间性能顺序栈要事先确定一个固定的长度可能会存在内存空间浪费的问题但它的优势是存取时定位很方便而链栈则要求每个元素都有指针域这同时也增加了一定的内存开销但对于栈的长度无限制。所以它们的区别和线性表中讨论的一样如果栈的使用过程中元素变化不可预料有时候很小有时候很大那么最好是用链栈如果它们的变化在可控范围内建议使用顺序栈会更好一些。
四、栈的作用
有的人可能会问用数组或链表直接实现功能不就行了吗为什么还要引入栈这个数据结构呢 其实这和我们明明有两只脚可以走路干嘛还要乘汽车、火车、飞机一样。理论上陆地上的任何地方你都是可以用双脚走到的可那需要多长时间和精力呢我们更关注的是到达而不是如何去的问题。 栈的引入简化了程序设计的问题划分了不同关注层次使得思考范围缩小更加聚焦于我们要解决的核心问题。反之像数组等因为要分散精力去考虑数组下标的增减问题反而掩盖了问题的本质。 所以现在的许多高级语言比如JavaC#等都有对栈结构的封装你可以不关注它的实现细节就可以直接使用Stack的push和pop方法非常方便。
五、栈的应用
一 递归 斐波那契数列 二四则运算表达式求值 后缀逆波兰表示法从左到右遍历表达式的每个数字和符号遇到是数字就进栈遇到是符号就将处于栈顶两个数字出栈进行运算运算结果进栈一直到最终获得结果。 中缀表示法从左到右遍历中缀表达式的每个数字和符号若是数字就输出即成为中缀表达式的一部分若是符号则判断其与栈顶符号的优先级是右括号有优先级不高于栈顶符号乘除有限加减则栈顶元素依次出栈并输出并将当前符号进栈直到最终输出后缀表达式为止。
队列
一、队列定义
队列queue是只允许在一端进行插入操作而在另一端进行删除操作的线性表。 队列是一种先进先出First In First Out的线性表简称FIFO。允许插入的一端称为队尾允许删除的一端称为队头。
二、队列的抽象数据类型
同样是线性表队列也有类似线性表的各种操作不同的就是插入数据只能在队尾进行删除数据只能在队头进行。
三、循环队列
队列也有线性表的两种存储方式顺序存储和链式存储。 入队操作是在队尾增加一个元素时间复杂度为O(1)。但是出队时如果规定队列中的元素都放在前n个位置则第一个元素出队后后面的元素都要向前移动以保证对头不为空也就是下标为0的位置不为空此时时间复杂度为O(n)。 但是我们可以想如果没有队列的元素都必须放在前n个位置的规定出队的性能就会大大增加。于是我们因为两个指针front指向对头元素rear指针指向队尾的下一个元素当frontrear队列为空。这样当出队时只需移动front指针即可。但是这样也会有一个问题一个队列不可能只有出队当继续进行入队操作致使队尾已经填满rear指针指向队列外时继续入队就可能产生数组越界的错误。但是由于前面已经进行过出队操作所以这个队列前面会有空位置这种现象称为“假溢出”。这里举个例子现实生活中当你上了一辆公交车发现前面有两个空位置但后排的座位都已经满了。这是你不会告诉自己后面没座了立马下车等待下一辆。我们都不会这么笨而都会坐在前面的位置。 这时就引入了循环队列的概念。循环队列就是首尾相接的顺序存储结构。 那么问题又来了前面提到当frontrear时队列为空但在循环队列中这个结论显然不成立。所以如何判断队列是空还是满呢以下给出两种方法 1. 设置一个标志变量flag当frontrear且flag0时队列为空当frontrear且flag1时队列满。 2. 当队列空时条件就是frontrear当队列满时我们修改条件保留一个元素空间。也就是说队列满时数组中还有一个空闲单元。 我们来重点讨论第二种方法由于rear可能比front大也可能比front小所以它们只相差一个位置时就是满的情况但也可能是相差整整一圈。所以若队列的最大尺寸是QueueSize那么队满的条件是rear1%QueueSizefront取模%的目的就是为了整合front和rear大小为一个问题 通用的计算队列长度的公式为rear-frontQueueSize%QueueSize 循环队列的相关条件和公式 1. 队空条件rearfront 2. 队满条件(rear1) %QueueSIzefront其中QueueSize为循环队列的最大长度 3. 计算队列长度rear-frontQueueSize%QueueSize 4. 入队rear1%QueueSize 5. 出队front1%QueueSize 到这里大家可以发现但是顺序存储若不是循环队列算法的时间性能是不高的但循环队列有面临着数组可能会溢出的问题所以我们还需要研究一样不需要担心队列长度的链式存储结构。
四、队列的链式存储结构及实现
队列的链式存储结构其实就是线性表的单链表只不过它只能尾尽头出而已称为链队列。将队头指针指向链队列的头结点队尾指针指向终端结点。 空队列是front和rear都指向头结点。 入队操作就是在链尾插入结点。 出队操作就是头结点的后继结点出队将头结点的后继改为它后面的结点若链表除头结点外只剩一个元素时则需将rear指向头结点。
对比循环队列和链队列时间上其实它们基本操作都是常数时间即都为O(1)的。不过循环队列是事先申请好空间使用期间不释放而对于链队列每次申请和释放结点也会存在一些时间开销如果入队出队频繁则两者还是存在细微差异。对于空间上来说循环队列不存在这个问题尽管它需要一个指针域会产生一些空间上的开销但也可以接受。所以在空间上链队列更加灵活。 总的来说在可以确定队列长度最大值的情况下建议使用循环队列如果无法预估队列长度则用链队列。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92513.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!