第三章:栈和队列

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

1.栈的应用

1.1括号匹配

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

匹配序列

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

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

不匹配序列

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

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

算法思想:

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

1.2表达式求值

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

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

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......

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

使用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,则整个过程为:

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

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

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

c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)相关推荐

  1. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  2. python 表达式求值_简单算术表达式求值

    本文主要探讨简单的数学算术表达式求值算法的原理和实现. 1. 约束 本文只是探讨简单的算术表达式的求值算法,为了将主要精力放在算法思想的探讨和实现上,避免陷入对其他不是直接相关的细节的过多思考,所以提 ...

  3. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

  4. 表达式求值问题数据结构课程设计

    完整代码在最后~~ 1 需求分析 1.1 问题描述 表达式求值是程序设计语言编译中的一个最基本问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的 ...

  5. 用python编写表达式求值_用Python3实现表达式求值

    Problem Description yizhen has no girlfriend due to his stupid brain that he even can't solve a simp ...

  6. python作业表达式求值_用Python3实现表达式求值

    一.题目描述 请用 python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...

  7. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  8. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...

    本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...

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

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

最新文章

  1. python绘图添加上下标
  2. 2019.7.9 校内测试题 史密斯数
  3. StrutsPreparedAndExcuteFilter与Interceptor
  4. 利用MATLAB进行系统时域分析,实验二 利用matlab进行系统的时域分析
  5. firewall mysql端口_Centos7 firewall开放3306端口
  6. 菜鸟创业记--第四天
  7. 组合数据类型,英文词频统计
  8. python信号处理教程_PhysioNet生理信号处理(五)--WFDB for Python(DEMO)
  9. 通过设置proxyTable实现调用接口跨域
  10. 图片尺寸判断等-我们到底能走多远系列(21)
  11. 有什么办法让Beyond Compare以网页形式显示文件
  12. mysql+keepalived实现双主自由切换
  13. 元数据管理在数据仓库的实践应用
  14. 如何理解失效模式与影响分析(FMEA)
  15. 5分钟了解什么是自然语言处理技术
  16. python的30个编程技巧
  17. 取消wps右键菜单_如何给你的WPS去广告!
  18. DataX及DataX-Web
  19. 如何安装ruby、rails
  20. 上千家企业涌入蚂蚁开放联盟链:在区块链上抢先吃红利螃蟹

热门文章

  1. 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
  2. 轻松搞定 SpringBoot 的邮件服务
  3. 20 万台 QQ 服务器全面上云!
  4. 高级工程师究竟比你“高”在哪?
  5. AIAR 应用的高效开发,OPPO 技术开放日第三期圆满落幕!
  6. 为什么越来越少的人用 jQuery?
  7. 不拥抱算法的张小龙,还能带着微信继续避免失败?
  8. 麦肯锡用 160 页报告告诉我们:13 年后 8 亿人的饭碗会被机器人抢了
  9. Java 9 正式发布,终落地 Jigsaw 项目
  10. 如何才能通过一线互联网公司面试?全网疯传