【0】README

0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现;
0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理清它的原理),故源代码中 考虑的数字是一位整型数(因为如果是两位数及以上的话,还涉及到字符串转int类型,虽然,我们没有加入其功能,但是还是定义了相关的函数,给出了接口的,朋友需要的话,可以自行实现)、还有就是 运算符的话,只考虑到了 *、+、(、),同样,如果朋友些需要的话,可以自行增加case 语句 or if 语句添加上即可;
0.3) 需要注意的是,操作数operand 和 操作符(运算符)operator 只能用char 类型将它们区分开;在中缀转后缀的过程中,只能用char类型的空间来存储它们的ASCII值(当然int空间也可以,也是存储它们的ASCII值);
0.4) 在计算后缀的过程中,需要把数字字符串(如123,它的ASCII序列为 49 50 51)转为int 类型或其他数据类型,所以本文中的源代码只处理 一位 整数的情况;朋友需要的话,自行添加;
0.5) 对于写算法代码的感悟, 重在理清算法原理 or idea,不要把输入输出的各种情况都考虑到, 那样很累,很烧精力,影响学习进度;其实只要实现了其 简单版本,实现复杂情况 也不是那样难;总之一句话,学习期间,我们不追求完美,一切从简,重在理解算法idea;
0.6) 题外话,曾经看到一位前辈说,栈有两种实现方法——数组实现+链表实现, 说在工作中,栈的数组实现应用的比较多,链表实现基本不怎么用,所以,你知道侧重点在哪里了;(当然可以 看看 栈的链表实现 了解了解)


【1】中缀到后缀的转换

1.1)此方法需要遵循几个规则(Rule):

  • R1)如果读入操作数,则直接放入输出字符串;
  • R2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低或两者相等的话,则需要将栈顶的运算符先放入输出字符串, 然后再将刚读入的运算符压栈;
  • R3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低;
  • R4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串;
  • R5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串;

1.2)看个荔枝【 将中缀表达式:a + b * c + (d * e + f) * g 转换为 后缀表达式: a b c * + d e * f + g * + 】
我们来看转换步骤:

  • step1)读入a,a被输出;读入+, 由于操作符栈空,故+进栈;读入b,b被输出;栈和输出的状态如下:

  • step2)读入*,由于栈顶+的优先级小于*,故*进栈;读入c,c被输出;栈和输出的状态如下:

  • step3)读入+,由于栈顶*的优先级大于+,*出栈被送往输出;有由于栈顶+的优先级等于+,+出栈被送往输出;栈和输出的状态如下:
  • step4)读入(,由于(的优先级最高,故(进栈;读入d,d被输出;栈和输出的状态如下:
  • step5)读入*,由于(和)不会被输出,故*进栈;读入e,e被输出;栈和输出的状态如下:
  • step6)读入+, 由于栈顶*的优先级大于+,故*出栈被送往输出;然后+进栈;读入f,f被输出;栈和输出的状态如下:
  • step7)读入),将栈中运算符出栈并被输出,直到取出(为止,而(和)不会被输出;栈和输出的状态如下:
  • step8)读入*, 由于栈顶+的优先级小于*,故*进栈;读入g,g被输出;栈和输出的状态如下:
  • step9)读完表达式后,栈中还有操作符,将它们出栈,并放入到输出字符串;栈和输出的状态如下:

  • 中缀转后缀的源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter3/p54_infix_to_postfix


【2】计算后缀表达式

2.1)后缀表达式定义: 4.99*1.06 + 5.99 + 6.99*1.06 转换为后缀表达式为: 4.99 1.06 * 5.99 + 6.99 1.06 * +;这种记法叫做 后缀 或者 逆波兰 记法;

2.2) 计算一个后缀表达式花费的时间是O(N);

2.3)计算后缀表达式规则(Rules):

  • R1) 如果是操作数,则放入栈中;
  • R2) 如果是操作符(运算符),则取出栈中两个操作数,进行运算后,将结果放入栈中;
  • R3) 直到最后栈中只有一个元素,此元素就是计算结果;

2.4)看个荔枝(计算后缀表达式 1 2 3 * + 4 5 * 6 +7 * + )

  • 我们看处理步骤:
  • step1)1、2、3进栈,结果如下:
  • step2)下面读到一个*, 所以2、3弹出, 将它们的积6压栈,结果如下:
  • step3)下面读到一个+,所以1、6弹出,将它们的和7压栈,结果如下:
  • step4)下面读到 4、5 , 将它们压栈,结果如下:
  • step5)下面读到一个*,所以4、5弹出,将它们的积20压栈,结果如下:
  • step6)下面读到6,所以6压栈,结果如下:
  • step7)下面读到一个+,所以20、6弹出,将它们的和26压栈,结果如下:
  • step8)下面读到7,所以7压栈,结果如下:
  • step9)下面读到一个*,所以26、7弹出,将它们的积182压栈,结果如下:
  • step10)下面读到一个+,所以7、182弹出,将它们的和189压栈,结果如下:
  • step11)最后栈中就只有一个元素189了,所以结果就是189,并将其返回到主函数;

  • 计算后缀表达式(只考虑‘+’和 ‘*’) 的源代码:
    https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter3/p52_compute_postfix

    • Attention)当一个表达式以 后缀记号 给出时,没有必要知道任何优先级规则, 这是一个明显的优点;

栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)相关推荐

  1. 使用栈实现中缀表达式转后缀表达式

    例子 例题1 中缀表达式"8+4-6*2" 后缀表达式表示为:8 4 + 6 2 * - 例题2 中缀表达式:(70 + 30) *20 + 10 / 2 - 3 后缀表达式: 7 ...

  2. java简易计算机(用栈实现中缀转后缀,计算后缀表达式)

    这学期java课的一个小作业,用java编一个小计算器. 个人认为要点在于: 1.计算机的布局,即按钮和输出框的布局需要知道怎么操作,按钮的大小和字体的大小颜色.不同布局中按钮的改变大小等等 2.用栈 ...

  3. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

  4. java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  5. C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式

    上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上一篇文章链接:C++做四则运算的MFC计算器(一)MFC ...

  6. 线性栈实现中缀表达式计算器

    前缀表达式转后缀表达式,及后缀表达式计算器 线性栈实现中缀表达式计算器 空格插入和弹栈计算 总体源代码 线性栈实现中缀表达式计算器 方法代码: 以(10+20/2*3)/2+8为例(计算结果为28): ...

  7. 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10--后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换.但是栈的应用方面还有很多,本次我将 ...

  8. 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)

    用栈实现中缀表达式的求值 步骤: 从左到右扫描,如果扫描到的运算符优先级大于栈顶运算符优先级,则入栈,否则,出栈并运算. 如果遇到右括号,一直出栈,直到遇到左括号为止.并且每一次出栈的运算符都要做一次 ...

  9. 数据结构栈之中缀表达式求值(实现计算器综合计算)

    一.思路分析: 1.通过一个index值(索引),来遍历我们的表达式. 2.如果我们发现是一个数字,就直接入数栈. 3.如果发现扫描到是一个符号,就分如下情况: (1).如果发现当前的符号栈为空,就直 ...

最新文章

  1. 【POJ】2377 Bad Cowtractors(最大生成树)
  2. 信息处理进入了计算机领域,信 息 处 理 进 入 了 计 算 机 领 域 ,实 质 是 进 入 了()的 领 域 。...
  3. Java中获取域名、端口号、项目名等实现路径适配
  4. ssl1643-最小乘车费用【dp练习】
  5. ARMv9刷屏 —— 号称十年最大变革,Realm机密计算技术有什么亮点?
  6. 动态规划 —— 背包问题
  7. 齐鲁计算机函授学院,【齐鲁师范学院继续教育学院自考网站】2021自考本科|电话|专业有哪些...
  8. 关于msi格式的程序包的安装
  9. HighGUI参考手册
  10. android studio创建构造方法,使用Android studio创建你的第一个项目
  11. 在IDEA中调试JavaScript代码
  12. SpringBoot启动后启动内嵌浏览器
  13. Structs个人适用知识整理
  14. ubuntu安装docker + 配置国内源和加速器
  15. RS码在AWGN信道和2PSK调制下的误码率曲线图(修改自lin_yulin,亲测可用)
  16. 近期有面试的必看!带你手撸红黑树,终获offer
  17. 微信小程序地图定位开发教程
  18. STM32驱动_cc2420
  19. Suit and Tie (在线swap 贪心 思维)
  20. 2018省赛第九届蓝桥杯真题C语言B组第九题题解 全球变暖

热门文章

  1. 牛客网 【每日一题】7月27日题目精讲—乌龟棋
  2. [八省联考2018]劈配 (匈牙利)
  3. P6860-象棋与马【欧拉函数,杜教筛】
  4. P5322-[BJOI2019]排兵布阵【背包】
  5. P4051-[JSOI2007]字符加密【SA】
  6. jzoj3888-正确答案【字符串hash,dfs】
  7. jzoj3084-超级变变变【数学】
  8. 【DP】【高精】幸运票 (jzoj 2122)
  9. HDU5833 异或方程组的初步学习
  10. Spark入门(七)Spark SQL thriftserver/beeline启动方式