1.前/中/后缀表达式的转换(首先需要明白三者之间的转换)

   自然表达式转换为前/中/后缀表达式,其实是很简单的。首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式。
    举例说明将自然表达式转换成二叉树:
    a×(b+c)-d
    ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树
   
   
   ②然后是a×(b+c),在写时注意左右的位置关系
   
   ③最后在右边加上 -d
   
    然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的:
    ① 前序遍历:根-左-右
   ② 中序遍历:左-根-右
   ③ 后序遍历:左-右-根
    所以还是以刚才的这个例子,在最终二叉树的基础上可以得出:
    前缀表达式:-*a+bcd
    中缀表达式:a*b+c-d
    后缀表达式:abc+*d-
2.中缀表达式转后缀表达式(栈的应用)  
 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式为“9 3 1- 3 * + 10 2 / +”.

规则:从左到右遍历中缀表达式的每一数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈  顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

a.初始化一空栈,用来对符号进出栈使用。

b.第一个字符是数字9,输出9,后面是符号“+”,进栈。

c.第三个字符是“(”,依然是符号,因其只是左括号,还没有配对,故进栈。

d.第四个字符是数字3,输出,总表达式为9 3,接着是“-”,进栈。

e.接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”。总的表达式为9 3 1 -。

f.接着是数字3,输出,总的表达式为9 3 1 - 3.紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,“*”进栈。

g.之后是符号“+”,此时当前栈顶元素“*”比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”更低的优先级,所以全部出栈),总输出表达式为9 3 1 - 3 * +。然后将当前这个符号“+”进栈。

h.紧接着数字10,输出,总表达式为9 3 1 - 3 * + 10。后是符号“/”,所以“/”进栈。

i.最后一个数字2,输出,总的表达式为9 3 1 - 3 * + 10 2。

j.因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为9 3 1 - 3 * + 10 2 / +。

3.后缀表达式计算结果(栈的应用)

后缀表达式为:9 3 1 - 3 * + 10 2 / +

规则为:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

a.初始化一个空栈。此栈用来对要运算的数字进行进出使用。

b.后缀表达式中前三个是、都是数字,所以9 3 1 进栈。

c.接下来是“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再讲2进栈。

d.接着是数字3进栈。

e.后面是“*”,也就意味着栈中3和2出栈,2与3相乘,得到6,并将6进栈。

f.下面是“+”,所以栈中6和9出栈,9和6相加,得到15,将15进栈。

g.接着是10和2两数字进栈。

h.接下来是符号“/”,因此,栈顶的2与10出栈,10与2相除,得到5,将5进栈。

i.最后一个是符号“+”,所以15与5出栈并相加,得到20,讲20进栈。

j.结果是20出栈,栈变为空。

[cpp] view plaincopy
  1. //下面的代码只是支持一些简单的整数的加减乘除运算,而且不支持浮点数,负数或者数字大于9的数字的运算,只是
  2. //自己简单的写一个代码,将这个过程进行的简单验证,如果需要解决复杂的计算问题,可以上网查找资料来实现!
  3. #include<iostream>
  4. #include<cstdio>
  5. #include<string>
  6. #include<stack>
  7. using namespace std;
  8. stack<char> s;
  9. stack<int> ss;
  10. int main()
  11. {
  12. int len1, len2, len, i, j;
  13. string str1, str2;//str1为中缀表达式,str2为后缀表达式
  14. while (1){
  15. //中缀表达式转换为后缀表达式
  16. getline(cin, str1);
  17. len1 = str1.length();
  18. str2.clear();
  19. for (i = 0; i < len1; i++){
  20. if (str1[i] >= '0' && str1[i] <= '9')
  21. str2.push_back(str1[i]);
  22. else{
  23. if (s.size() == 0 || str1[i] == '(')
  24. s.push(str1[i]);
  25. else{
  26. char tmp1 = s.top();
  27. if (str1[i] == ')'){
  28. len = s.size();
  29. while (len){
  30. char tmp = s.top();
  31. s.pop();
  32. if (tmp == '(')
  33. break;
  34. else
  35. str2.push_back(tmp);
  36. len--;
  37. }
  38. }
  39. else{
  40. if (tmp1 == '*' || tmp1 == '/'){
  41. if (str1[i] == '*' || str1[i] == '/')
  42. s.push(str1[i]);
  43. else{
  44. len = s.size();
  45. while (len){
  46. char tmp = s.top();
  47. str2.push_back(tmp);
  48. s.pop();
  49. len--;
  50. }
  51. s.push(str1[i]);
  52. }
  53. }
  54. else{
  55. s.push(str1[i]);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. if (s.size() != 0){
  62. len = s.size();
  63. while (len){
  64. char tmp = s.top();
  65. str2.push_back(tmp);
  66. s.pop();
  67. len--;
  68. }
  69. }
  70. cout << str2 << endl;
  71. //由后缀表达式计算结果
  72. int temp1, temp2, temp3;
  73. len2 = str2.length();
  74. for (i = 0; i < len2; i++){
  75. if (str2[i] >= '0' && str2[i] <= '9'){
  76. int t = str2[i]-48;
  77. ss.push(t);
  78. }
  79. else{
  80. temp1 = ss.top();
  81. ss.pop();
  82. temp2 = ss.top();
  83. ss.pop();
  84. if (str2[i] == '+'){
  85. temp3 = temp2 + temp1;
  86. }
  87. else if (str2[i] == '-'){
  88. temp3 = temp2 - temp1;
  89. }
  90. else if (str2[i] == '*'){
  91. temp3 = temp2 * temp1;
  92. }
  93. else if (str2[i] == '/'){
  94. temp3 = temp2 / temp1;
  95. }
  96. ss.push(temp3);
  97. }
  98. }
  99. cout << ss.top() << endl;
  100. }
  101. system("pause");
  102. }

四则运算表达式求值(栈的应用)相关推荐

  1. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  2. 栈的应用(递归:例子裴波那契数列 四则运算表达式求值 :后缀(逆波兰) )

    递归: -栈有一个很重要的应用:在程序设计语言中实现递归. 当你往镜子前面一站,镜子里面就有-一个你的像. 但你试过两面镜子一起照吗?如果A.B两面镜子相互面对面放着,你往中间- -站,嘿,两面镜子里 ...

  3. 四则运算表达式求值の各种心碎

    实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一 ...

  4. Bailian4132 四则运算表达式求值【文本处理】

    4132:四则运算表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 求一个可以带括号的小学算术四则运算表达式的值 输入 一行,一个四则运算表达式.''表示乘法,'/'表示除法 ...

  5. 分别用C++和JavaScript 实现四则运算表达式求值

    博主16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果.当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的 ...

  6. 栈运算 java_栈的应用——四则运算表达式求值(Java实现)

    首先介绍几个概念 中缀式:平常我们所用到的标准的四则运算表达式就是中缀式,如9+(3-1)*3+10/2,这就是一个中缀式 后缀式(逆波兰式):一种不需要括号的后缀表达法,我们也把他称为逆波兰式,如将 ...

  7. 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈

    秋实大哥搞算数 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1074 Des ...

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

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

  9. 表达式求值(数据结构栈,c语言版)

    表达式求值 一.实验题目 1.案例分析 2.案例实现 3.算法步骤 4.算法描述 二.工具环境 三.实验问题 四.实验代码 一.实验题目 1.案例分析 任何一个表达式都是由操作数(operand)运算 ...

最新文章

  1. react组件回顶部
  2. 关闭不安全端口的脚步
  3. 读书笔记-沙漠里的细水微光
  4. 在FCKeditor 2.6中添加插入视频和音频功能(最新修订版)
  5. java.lang.UnsatisfiedLinkError: com.jacob.com.D...
  6. [Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
  7. n个数里找出前m个数(或者 从10亿个浮点数中找出最大的1万个)
  8. html将excel数据自动导入到网页,如何把excel表中的数据自动输入到网页中
  9. 多媒体计算机是多媒体教室的核心部件,浅析多媒体教室的设备配置
  10. 【TensorFlow】TensorFlow函数精讲之tf.constant()
  11. 视觉SLAM——D435i运行ORB-SLAM3-mono(依赖ros版)
  12. Java8 Math新增方法
  13. 图像识别中——目标分割、目标识别、目标检测和目标跟踪的区别
  14. sqlserver2008的数据库自动备份方法(转载)
  15. 696.计数二进制子串(力扣leetcode) 博主可答疑该问题
  16. UTM坐标系与GPS坐标系转换笔记
  17. Windows设置exe或者bat文件开机启动的几种方法汇总
  18. Oracle查询排列组合,Oracle SQL排列组合之组合问题
  19. 语音识别软件_语音识别 软件_日语语音识别软件 - 云+社区 - 腾讯云
  20. 正则表达式训练-QQ号校验

热门文章

  1. 【Android 安全】DEX 加密 ( Proguard 简介 | 默认 ProGuard 分析 )
  2. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
  3. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
  4. 【Android 应用开发】 ActionBar 基础
  5. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
  6. JavaScript HTML DOM - 改变 CSS
  7. 实验0 了解和熟悉操作系统
  8. 机器学习公开课笔记(1):机器学习简介及一元线性回归
  9. perl 命令行小记
  10. GridView的Command命令集合