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

技术标签: 算法  括号匹配  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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签