1 /*
  2         参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式,
  3        将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算
  4 */
  5 #include<iostream>
  6 #include<string>
  7 #include<stack>
  8 #include<cstdio>
  9 using namespace std;
 10
 11 class node
 12 {
 13 public:
 14      double ret;
 15      string prefix, suffix;//前缀表达式和后缀表达式
 16      node()
 17      {
 18          ret=0;
 19          prefix=suffix="";
 20      }
 21 };
 22
 23 stack<node>optd;//操作数栈
 24 stack<char>optr;//操作符栈
 25
 26 char formula[1000];//表达式以"=" 结束
 27
 28 int cmp(char ch)//定义符号的优先级
 29 {
 30    switch(ch)
 31    {
 32       case '#': return -2;
 33       case '=': return -1;
 34       case '+':
 35       case '-': return 1;
 36       case '*':
 37       case '/': return 2;
 38       case '(': return 3;
 39       case ')': return 0;
 40    }
 41    return -2;
 42 }
 43
 44 double deal(double x, char ch, double y)
 45 {
 46    switch(ch)
 47    {
 48        case '+': return x+y;
 49        case '-': return x-y;
 50        case '*': return x*y;
 51        case '/': return x/y;
 52    }
 53    return 0.0;
 54 }
 55
 56 void cal()
 57 {
 58    int i=0, n;
 59    node num, aTmp, bTmp;
 60    while(optr.top()!='=')
 61    {
 62       if(formula[i]>='0' && formula[i]<='9')
 63       {
 64            sscanf(formula+i, "%lf%n", &num.ret, &n);
 65            num.prefix.assign(formula+i, n);
 66            num.suffix.assign(formula+i, n);
 67            i+=n;
 68            optd.push(num);
 69       }
 70       else
 71       {
 72            if(optr.top()=='(' && formula[i]==')')//消除一对括弧
 73            {
 74          optr.pop();
 75          ++i;
 76          }
 77            if(cmp(formula[i]) > cmp(optr.top()) || optr.top()=='(')//当前运算符大于栈顶运算符直接进栈
 78      {
 79          optr.push(formula[i]);
 80          ++i;
 81      }
 82      else
 83      {
 84         char ch=optr.top(), preTmp[]={ch, ' ', '\0'}, sufTmp[]={' ', ch, '\0'} ;
 85         optr.pop();//弹出一个栈顶操作符
 86         bTmp=optd.top(); optd.pop();//得到第二个操作数
 87         aTmp=optd.top(); optd.pop();//得到第一个操作数
 88         aTmp.ret=deal(aTmp.ret, ch, bTmp.ret);
 89
 90         aTmp.suffix+=" " + bTmp.suffix + sufTmp;//得到运算后的后缀式子
 91         aTmp.prefix=preTmp + aTmp.prefix + " " + bTmp.prefix;//得到运算前的后缀式子
 92         optd.push(aTmp);//不要忘记将计算的结果放入栈中
 93      }
 94       }
 95    }
 96    optr.pop();//别忘记弹出栈顶上的'='
 97 }
 98
 99 int main()
100 {
101    optr.push('#');//初始化栈顶操作符是‘#’
102    while(cin>>formula)
103    {
104        cal();
105        node ans=optd.top(); optd.pop();
106        cout<<"表达式结果:"<<ans.ret<<endl<<"前缀试:"<<ans.prefix+'='<<endl<<"后缀试:"<<ans.suffix+'='<<endl;
107    }
108    return 0;
109 }

转载于:https://www.cnblogs.com/hujunzheng/p/3785647.html

中缀试转后缀试及前缀试并计算其结果相关推荐

  1. C#数据结构-前缀中缀后缀+中缀转后缀

    目录 一.前缀中缀后缀表达式 1.中缀表达式 2.前缀表达式 3.后缀表达式 二.中缀转后缀 一.前缀中缀后缀表达式 1.中缀表达式 中缀表达式就是平常生活中计算式子的写法,例如:(3+4)*5-6  ...

  2. 前缀、中缀、后缀表达式(转载)

    关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...

  3. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e) 首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e)) 将运算符号移动到对应括号的前面然后去掉所有 ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. 一行文章让你搞懂什么是前缀、中缀、后缀表达式以及它们之间的相互转换

    一.什么前缀.中缀.后缀表达式(使用 8*(5+6)-1的例子) 1.中缀表达式:8*(5+6)-1:(也就是我们平常所见的运算式) 2.后缀表达式:8 5 6 + * 1 - :计算机是怎么运算的呢 ...

  6. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算

    第三章 栈和队列 1. 输出队列问题 2. 表达式的转换 - 手工转换 2.1 中缀表达式 转 前缀表达式 2.2 中缀表达式 转 后缀表达式 2.3 后缀表达式 转 中缀表达式 2.4 后缀表达式 ...

  7. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  8. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  9. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

最新文章

  1. 64 位系统遇到未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0
  2. mysql查询每个机构下的账号总数_MySQL高可用方案:实践篇
  3. mysql 分页 jdbc_JDBC调用MySQL分页存储过程实现(一)
  4. 请问我应该怎么做,才能让前端的基础打牢固?
  5. java asm源码分析_探究CAS原理(基于JAVA8源码分析)
  6. iOS 操作系统被曝无线网络命名bug 导致 iPhone无法连接无线网络
  7. 2019,别进大厂了!
  8. 《码出高效:Java开发手册》百度网盘下载
  9. DHT,种子转磁力算法 种子info_hash 代码亲测
  10. yandex安装插件教程,研究了一下午终于可以用了
  11. 人工智能学习资料之2021图灵大会笔记
  12. c语言if用法详解,C语言if语句的使用讲解
  13. 推荐一款轻量级的支持Markdown的团队知识分享开源软件
  14. 外文图书免费下载网站
  15. python计算学习,《统计学习方法》的Python实现:(1)感知机
  16. 轻松玩转Linux之撩妹神器一一Shell脚本
  17. 小白如何选择采集器-爬虫
  18. UI自动化工具Cypress测试案例、生成报告---Linux版
  19. 离线识别率最高的Python人脸识别系统
  20. Python集合关系解读:Python语言中都有哪些集合关系?

热门文章

  1. 状态管理 - 全局状态管理工具
  2. data.name.toLowerCase() is not a function问题
  3. 树形结构递归初始化(父节点,统计字段等)
  4. SpringBoot xml层SQL update之foreach循环的坑
  5. python开两个守护线程_python 守护线程
  6. object转float_人工智能-Object Detection API 模型转tflite并验证
  7. 手机站的view.php,织梦网站文章内容页动态地址plus/view.php路径修改
  8. BugkuCTF-MISC题where is flag
  9. 机器视觉技术及应用_工业机器人视觉技术的应用前景
  10. java欧冠抽签,欧冠抽签吐槽:最大的“礼包”被C罗拿走!梅西出局概率超50%?...