数据结构考研笔记之栈与队列(四)栈与队列应用----括号匹配、中缀表达式转前缀后缀问题_中缀表达式转前缀题目-程序员宅基地

技术标签: 算法  括号匹配  C语言  考研数据结构笔记    数据结构  

1.括号匹配问题

在这里插入图片描述

例题1

在这里插入图片描述
算法思想:
1)初始一个空栈,顺序读入括号。
若是右括号,则与栈顶元素进行匹配
·若匹配,则弹出栈顶元素并进行下一个元素
·若不匹配,则该序列不合法
3)若是左括号,则压入栈中
4)若全部元素遍历完毕,栈中非空则序列不合法

解题
1.首先1、2都是左括号,直接进栈
在这里插入图片描述
2.第3个括号是右括号‘)’并且和2’(‘匹配,所以弹出当前栈顶元素,如下图
在这里插入图片描述

例题2-----不匹配例题1

在这里插入图片描述
解题
1.和刚才一样,左括号进栈
在这里插入图片描述
2.第3个括号是右括号且与当前栈顶左括号2不匹配,所以此题不匹配
在这里插入图片描述

例题3-----不匹配例题2

题目:
在这里插入图片描述
解题
在这里插入图片描述
1.左括号1、2进栈,如下图
在这里插入图片描述
2.第三个括号为右括号且与当前栈顶2 左括号匹配,所以弹出此时栈顶2 左括号,
然后括号4‘ ]’,与当前栈顶1 左括号’[‘,相匹配,所以弹出此时栈顶1’[‘
第5个为左括号进栈,如下图
在这里插入图片描述
3.栈非空,不合法。

2. 表达式求值问题

前缀表达式:+AB
中缀表达式:A+B
后缀表达式:AB+
符号分别在式子的前中后

例题

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

1.中缀表达式转前缀表达式

1.最先运算的A+B ,‘+’提前,如下图
在这里插入图片描述
2,然后是()*c, 转换前缀就是将*提前 ,如下图
在这里插入图片描述
3,E-F, 将‘-’提前。如下图
在这里插入图片描述
4.最后一步就是【】-【】,两个中括号相减, 改为前缀就是将减号提前,如下图
在这里插入图片描述
[(A+B)*C]- [E-F] 转成下图
在这里插入图片描述

2.中缀表达式转后缀表达式

1,式子首先运算A+B,将’+‘后移,如下图:A B +
在这里插入图片描述
2,*计算( )*c,转为后缀是将’*‘后移,为()C ,如下图:
在这里插入图片描述
3,计算[E-F],将’-’后移,E F - ,如下图
在这里插入图片描述
4,计算[ ] -[ ],将‘-’后移 [ ] [ ] - , 如下图
在这里插入图片描述
最终:A B + C * E F - -

实现过程:

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

1.都为左括号,入栈(算法思想中情况a),如下图
在这里插入图片描述
2,数字A直接加入表达式
3.加号‘+’,且此时栈顶为左括号,入栈操作,(算法思想中c)如下图
在这里插入图片描述
4.数字B直接加入表达式
5.符号‘)’,(算法思想b)依次将此时栈中元素弹出加入后缀表达式直到遇到左括号‘(’,并从栈中删除“(”,如下图,
在这里插入图片描述
删除后,栈中只有第一个‘(’
在这里插入图片描述
6.符号‘’,(算法思想c)此时栈顶为‘(’ ,直接入栈,如下图
在这里插入图片描述
7.减号‘-’,不高于此时栈顶‘
’的优先级,弹出栈中元素,直到‘(’,(算法思想c).
在这里插入图片描述
在这里插入图片描述

8.减号‘-’,此时栈为空,直接入栈(算法思想C)
左括号‘(’,直接入栈
数字E直接加入后缀(算法思想a)
减号‘-’,因为此时栈顶为左括号‘(’,所以减号直接入栈(算法思想C)
数字F直接加入后缀(算法思想a)
在这里插入图片描述
9.右括号‘)’,依次弹出栈顶加入到后缀,直到遇到左括号‘(’(算法思想b)。
在这里插入图片描述
在这里插入图片描述
10.遍历完了,若栈不为空,将栈中数据依次弹出加入到后缀。(算法思想d)
在这里插入图片描述

3. 递归:

递归若在一个函数、过程或数据结构的定义中又应用了它自身,则称它为递归定义的,简称递归
在这里插入图片描述
在这里插入图片描述

int Fib(int n){
    
	if(n == o)
		return 0 ;
	else if(n == 1)
		return l;
	else
		return Fib(n-1) + Fib (n-2);
)

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

递归产生的问题:

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

***递归转换算法转换为非递归算法,往往需要借助栈来进行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sf9090/article/details/108992468

智能推荐

Android进阶之路 - 简单实现聊天功能_android客服聊天功能模板-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏31次。记得几年以前看到聊天功能时总是不得所以,现在回头一看,发现其实实现方式非常简单,故此记录一番 ~ 实现效果实现思想实现方式导入依赖创建model创建适配器使用场景实现效果一个入门级的Demo、只能满足基本需求 ~实现思想一个垂直的list列表一个有tag的model标记tag,用于区分用户不同tag,展示不同UI实现方式导入依赖篇中用到的 RecyclerVie..._android客服聊天功能模板

数据产品经理基础技能:数据需求说明文档怎么写?-程序员宅基地

文章浏览阅读1.6k次。公众号后台回复“图书“,了解更多号主新书内容 作者:草帽小子 来源:一个数据人的自留地作者介绍@草帽小子数据产品经理一枚~用户画像、埋点、指标体系、BI、广告投放..._统计维度需求说明

【ElasticSearch-基础篇】ES高级查询Query DSL Bool Query布尔查询_es query bool-程序员宅基地

文章浏览阅读516次,点赞6次,收藏7次。ElasticSearch结合springboot使用Bool Query布尔查询_es query bool

【SpinalHDL】Scala编程中的class及case class-程序员宅基地

文章浏览阅读1k次,点赞18次,收藏28次。本篇文章仅简单介绍在spinalhdl编程中遇到的比较常见的2中类定义方式:class及case class。对于不太了解JAVA或Scala编码又开始学习SpinalHDL的人进行入门介绍。在 SpinalHDL 中,case class 和 class 都是用来定义数据结构或对象的关键字,它们在某些方面相似,但也有一些显著的差异。

Matlab遗传算法求带时间窗的单配送中心车辆调度与路径优化问题(VRPTW):低配版_matlab遗传算法路径优化单配送中心-程序员宅基地

文章浏览阅读819次。现有一配送站(序号为0)和16个客户点(序号为1-16),它们有不同数量的货物需求,每个客户点的需求量和要求的最早配送时间和最晚配送时间,配送车在每个站点的服务时间等如下表所示。该配送中心向客户提供货物的配送服务,由一个车队(最多10辆车)来负责,现需要规划合适的车辆数和行车路线,目标是使得在客户的需求得到满足,并能在车辆容量和时间窗约束下达到成本最小,请给出具体的配送方案。Matlab遗传算法求带时间窗的单配送中心车辆调度与路径优化问题(VRPTW):低配版。表1 车辆路径(物流配送)问题已知量统计表。_matlab遗传算法路径优化单配送中心

Java_io体系之PipedWriter、PipedReader简介、走进源码及示例——14-程序员宅基地

文章浏览阅读136次。Java_io体系之PipedWriter、PipedReader简介、走进源码及示例——14 ——管道字符输出流、必须建立在管道输入流之上、所以先介绍管道字符输出流。可以先看示例或者总结、总结写的有点Q、不喜可无视、有误的地方指出则不胜感激。一:PipedWriter1、类功能简介: 管道字符输出流、用于将当前线程的指定字符写入到与此线程对应的..._piped io

随便推点

Location 对象,URL 对象,URLSearchParams 对象-程序员宅基地

文章浏览阅读757次,点赞2次,收藏2次。作者 | 阮一峰URL 是互联网的基础设施之一。浏览器提供了一些原生对象,用来管理 URL。1、Location 对象Location对象是浏览器提供的原生对象,提供 URL 相关的信..._cannot set property searchparams of [object url] which has only a getter

Easy Application for U.S company_upload your resumefill out manually (15 min)-程序员宅基地

文章浏览阅读3.3k次。Easy ApplicationHave you ever tried to apply for a company only to discover they won't let you upload your resume? Instead you have to meticulously fill out pages of information (all of which could_upload your resumefill out manually (15 min)

更改Linux文件属主-程序员宅基地

文章浏览阅读244次。chown [-R] 用户名 目录名/文件名修改目录或文件所属用户,可选的-R参数表示是否递归修改。也可以同时修改所属用户和用户组,例如:chown -R <用户名>:<用户组名> <目录名> chgrp [-R] 用户组名 目录名/文件名修改目录或文件所属用户组,可选的-R参数表示是否递归修改。..._linux改变文件属主的命令

getParameter和getAttribute的区别是什么?_getattribute和getparameter有什么区别-程序员宅基地

文章浏览阅读1.4k次。楼主xxmm(晓箫)2001-07-22 21:18:05 在 Java / Web 开发 提问问题点数:20、回复次数:5Top 1 楼yelz(断弦)回复于 2001-07-22 21:55:46 得分 8getParameter 返回上个页面提交得参数,getAttribute返回系统属性,不同jsp服务器可能不同。Top2 楼xxmm(晓箫)回复于 2001-07-_getattribute和getparameter有什么区别

大数据第三季--Hbase(day5)-徐培成-专题视频课程-程序员宅基地

文章浏览阅读96次。大数据第三季--Hbase(day5)_【六期-12day】数据仓库+hbase\数据仓库03-上午

“cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib'”错误的解决办法-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏5次。今天写spring配置文件的时候出现cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib的错误,查资料后发现的命令空间引入的问题解决方法很简单把http://www.springmodules.org/schema/cache/springmodules-cache.xsd复制_cvc-complex-type.2.4.a: invalid content was found starting with element 'pha

推荐文章

热门文章

相关标签