c++数据结构队列栈尸体_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)...

第三章:栈和队列

下面讲解栈的应用主要内容有:栈的应用、括号匹配、中 后 前 缀表达式转换

1.栈的应用

1.1括号匹配

我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ) 来表示运算的优先级,我们把这样的[ ] 和 ( ) 提取出来组成的序列叫做括号匹配序列。

匹配序列

  • ( [ ( ) ] )
  • [ ] [ ] ( )
  • ( ) [ ( ) ]

上面是正确的可以匹配的序列,每一个( 或者[都有与之对应的)或者]。

不匹配序列

  • ( [ ( ) ]
  • ] [ ] ( )
  • ( ] [ ( ) ]

下面是一个正确匹配的序列,我们给每一个标上号,一次输入到栈中,判断阔号是否匹配。

c3298943af702feeb684c7f8198ea548.png

算法思想:

  • 1.初始化一个空栈,顺序读入阔号
  • 2.若是右阔号,则与栈顶元素进行匹配
    • 若匹配,则弹出栈顶元素进行下一个元素
    • 若不匹配,则该序列不合法
  • 3.若是左阔号,则压入栈中
  • 4.如果全部元素遍历完毕,栈中非空则序列不合法

1.2表达式求值

例如:A+B+C-E-F 像这种简单的表达式求值我们通过遍历,加上if 判断就可以解决,但是[(A+B)*C]-(E-F)这种比较复杂的表达式这就有一些复杂的优先级了。这就需要栈来解决了,下面介绍几种表达式的分类。

b3937477bf3d630d4eaf6702e1b6a8b4.png

在解决表达式求值的问题我们通常要将中缀表达式转成前缀表达式或者转成后缀表达式,不过最常用的还是转成后缀表达式。常常用后缀表达式计算表达式的值。

1.3中缀表达式转前&后缀

中缀转前缀&后缀

[(A+B)*C]-(E-F)

我们按照运算的优先级首先计算(A+B)将它转成前缀:+AB,[+AB*C]-(E-F) 接着乘以C转成前缀为:* +ABC,这样第一个方括号的转换完毕,接着按照运算优先级,将[E-F]转成前缀:-EF,现在表达式为:* +ABC-(-EF),接着将中间的-提到最前面的:-*+ABC-EF

前缀表达式:- * + A B C - E F

过程和上面的过程相同,只不过将运算符号号放后面就行。

后缀表达式:A B + C * E F - -

使用栈将中缀转后缀的算法思想:

( ( A + B ) * C ) - ( E - F )

  • 数字直接加入后缀表达式
  • 运算符时:
  • a.若为(,入栈;.b
  • b.若为'),则依次把栈中的运算符加入后缀表达式,直到出现(,并从栈中删除(
  • c.若为+,-,*,/
    • 1.栈空,入栈;
    • 2.栈顶元素为(,入栈;
    • 3.高于栈顶元素优先级,入栈;·
    • 4.否则,依次弹出栈顶运算符,直到一个优先级比它低的运算符或(为止;`
  • d.遍历完成,若栈非空依次弹出所有元素。

使用此思想执行一遍将表达式装成后缀:

为了方便文字描述,定义一个H作为后缀表达式,定义一个Z栈。首先( (依次入栈(规则:a),此时Z=( (,接着数字A,直接加入后缀表达式中此时H=A接着+入栈(规则:c 2),此时Z=*((+接着B直接加入后缀表达式中:H=AB,接着)入栈符合规则b,则此时Z=(,H=AB+,接着*入栈,Z=(*,接着)入栈符合规则b,则此时Z=空,H=AB+C*,接着-(依次入栈,此时Z=-(,接着E,直接加入后缀表达式:H=AB+C*E,接着-入栈,此时Z=-(-接着F直接加入后缀表达式中,H=AB+C*EF,接着)入栈符合规则b,则此时z=-,H=AB+C*EF-,然后符合规则d,此时z=空,H=AB+C*EF- -。

2.递归

递归 若在一个函数、过程或数据结构的定义中又应用了它自身,则称它为递归定义的,简称递归

常见得递归例子:

斐波那契数列:0,1,1,2,3,5......

此数列从第三项开始每一项等于前两项得和。

85c76d4447191e069687b4add997e794.png

使用C实现该递归过程

int Fib(int n){//n是第几个斐波那契数    if(n==0){       return 0;    }else if(n==1){       return 1;    }else if(){       return Fib(n-1)+Fib(n-2);    }}

递归精髓在于能否将原始问题转换为属性相同但规模较小的问题。

2.1递归产生的问题

  • 在递归调用过程中,系统为每一层的返回点、局部变量、传入实参等开辟了递归工作栈来进行数据存储,递归次数过多容易造成栈溢出。
  • 通常情况下递归的效率并不高

比如上述的斐波那契数列函数,假如我们传入5,则整个过程为:

4ed1216b18cae903abf2834a79c92c3f.png

我们会发现,这当中我们发现一些相同结果我们会重复调用很多遍,这样的重复调用会造成递归的效率不高的问题。

在递归算法转换成非递归算法时,往往需要借助栈来进行。

关于数据结构的知识,持续更新中,欢迎关注公众号理木客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试你是什么样的双眼皮软件,来测试你适合哪种双眼皮?

你的脸型适合哪种双眼皮?自己可以来测试下很多人喜欢大眼睛,双眼皮,觉得越宽越大越好看。我觉得只要和自己五官协调就是最好看的。不同脸型适合什么样的双眼皮?1、平行型:适合眼睛比较大、眉弓比较高、眉毛距眼睛较远且…

服务器内存不认硬盘_服务器品牌有哪些?如何选择服务器?

前段时间我们发布丰富机房建设相关内容,有很多朋友就问到如何保证服务器可以支持百万用户访问?服务器品牌有哪些?服务打开速度慢怎么办?选择服务器主要看哪些参数?。本期我们一起来了解这方面内容。一、服务器品牌服务…

mpi由于目标计算机积极拒绝,windows系统lammps安装MPICH2的问题

20170610补充:补充上次补充内容的文字说明:MPICH2的安装一半没问题。最常遇到的问题是不清楚注册时候到底使用哪个用户名或者计算机名。在确保安装成功的前提下,运行命令:mpiexec -register会让输入用户名和密码。这个用户名是计算…

datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集

这是第151篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员)本期目录:如何规划UI…

贾立平是中科学院计算机所博士,中国科学院博士生贾立平:创新变通能力才是未来最根本的竞争力...

人民网北京1月8日电 宇宙巡游2020——UCCA Kids艺术嘉年华4日开幕。中国科学院博士生贾立平表示,脑科学可以更好地了解孩子的想象力、创造力,通过艺术,会更快地促进孩子能力的发展。“宇宙巡游2020”儿童艺术展览学生作品《太阳系的热带森林》…

音频服务器未运行怎么办,音频服务未运行怎么办 音频服务未运行解决方法【详细介绍】...

最近许多网友在使用电脑时遇到了“音频服务未运行”的错误提示,出现这种提示的原因有很多,症状也不尽相同。今天我们就针对不同的“音频服务未运行”症状进行分析解答,希望能对大家有所帮助。由于音频服务未运行可能是硬件配置不正确造成的&a…

jquery查找父窗体id_Vue父组件获取子组件中的变量

全世界只有不到3 % 的人关注了我你真是个特别的人在vue项目日常开发中,难免要把功能性组件抽离出来,这样结构就会出现父子组件,兄弟组件等,但是这样就会涉及到不同组件需要互相使用其中的某个值的问题。之前有说过通过ref来让父组…

服务器固态硬盘接口类型,固态硬盘接口都有哪些类型

其实固态硬盘拥有几种接口,根据不同应用场合的固态硬盘一般会有不同的接口。固态硬盘与传统机械硬盘相比,接口规格较多也容易被初用者混淆,因此小编特意整理了一篇名叫“怎么看固态硬盘接口?固态硬盘接口都有哪些类型?”的文章,…

汉字为什么能流传至今_能让历史重新活起来的中国舞,再次席卷而来

如果那些耳熟能详的故事,通过舞蹈重新出现在你的眼前。不再让你仅凭想象,去体会它独一无二的魅力时,你愿意静下心,去重新定义“舞蹈”吗?当书本上的汉字跳跃到你的眼前,当一切虚幻的想象,用舞蹈…

我的世界服务器的文件名叫什么,我的世界 外国服务器叫什么名字 | 手游网游页游攻略大全...

发布时间:2015-11-15COD5服务器里改名字颜色 改名字颜色方法1:1. 搜索config_mp.cfg 文件2. 用记事本打开该文件 搜索seta clanName ""3. 在&qu ...标签:使命召唤5:世界战争发布时间:2015-11-10伤害世界Hurtworld服…

友盟消息推送服务器demo,友盟消息推送总结

分享的文章连接1 http://blog.csdn.net/shenjie12345678/article/details/411206372;http://dev.umeng.com/push/ios/integration重点解析:1:如何获得友盟推送的AppKey?1.1登陆到友盟的消息推送界面——>添加应用,出现如下界面…

cocos creator 方法数组_基于 Cocos 游戏引擎的音视频研发探索

本文转载自公众号:流利说技术团队(lls_tech)版权归原作者所有本文主要介绍了流利说团队基于 Cocos 游戏引擎进行音视频相关需求开发过程中所遇到的问题和解决方案。文章中将依次阐述 Cocos 引擎直接渲染视频的方案,继而引申出多线程环境下 OpenGL 环境的…

华为服务器双系统教程,服务器上安装双系统

服务器上安装双系统 内容精选换一换Atlas 800 训练服务器(型号 9000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9000, 风冷)》或《Atlas 800 训练服务器 用户指南 (型号9000, 液冷)》。Atlas 800 训练服务器(型号 9000)适配…

线程销毁_多线程(2)-Java高级知识(9)

前面有一篇文章写的是多线程的基本知识,以及线程实现的两种方式,一种是继承Thread类,另一种实现Runnable 接口,今天沿着前面的多线程,继续分享多线程的第三种创建方法,以及第三种创建方法的优势&#xff0c…

怎么查看服务器系统内存,怎么查看服务器系统内存

怎么查看服务器系统内存 内容精选换一换确认服务器服务是否开启。登录虚拟机内部。执行如下命令,查看系统的端口监听状态,如图1所示。netstat -ntplWindows虚拟机可以在命令行中执行netstat -ano查看系统的端口监听状态,或者查看服务端软件状…

as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置

综述 Flutter从架构上来说有3部分:用Dart写的Framework层,面向开发者用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flutter App不需要关心用C写的Engine层,提供Dart运行环境和底层绘制能力针对每个部分&a…

workbook加载文件路径_【Python】文件重命名(按照Excel清单)

问题:1、扫描了很多文件,想批量加上文件编号2、网页下载了一堆图片,批量加上图片分类3、文件命名不规范,想批量调整效果图:需求解析:1、想重命名,就要有原名字和修改后的名字,清单准…

ppap文件过程流程图制作_收藏 | 据说PPAP的精华都在这个PPT里!一起来鉴定下

一组数字的PPAP3种情况必须提交8种情况通知提交5种提交等级3种提交状态18份提交内容“3”——以下3种情况,必须向顾客提交PPAP:1)一种新的零件或产品;2)对以前所提供不符合零件的纠正;3)由于设计记录、规范或材料方面的工程变更从…

++实现 ipv6数据报_IPV6报文格式和IPV4有什么区别?

前言RFC2460定义了IPv6数据报格式。总体结构上,IPv6数据报格式与IPv4数据报格式是一样的,也是由IP报头和数据(在IPv6中称为有效载荷)这两个部分组成的。但在IPv6数据报数据部分还可以包括0个或者多个IPv6扩展报头(Extension header)。正文1IPV6报文格式如…

曲面设计步骤pdf_3dmax模渲大师|室外设计师怎么用3dmax疯狂模渲大师制作室内设计效果图的外景天空?...

3dmax模渲大师|室外设计师怎么用3dmax疯狂模渲大师制作室内设计效果图的外景天空?这次食住玩讲的是第十三章的第1节,3dmax疯狂模渲大师室外设计篇的第1课——“外景天空”的使用方法。在室内设计效果图领域,也有要涉及室外的时候。…