逆波兰表达式又称作后缀表达式,在四则混合运算的程序设计中用到。

例如:

1+2写成后缀表达式就是12+

4+5*(3-2)的后缀表达式就是4532-*+

后缀表达式在四则运算中带来了意想不到的方便,在生成过程中自动保持了优先级;

生成逆波兰表达式的算法如下:

我们首先的用两个栈结构来存储运算符和操作数;

从做到右遍历我们输入的中缀表达式:

1、如果是操作数的话,那么就直接压入存放操作数的堆栈;

2、如果是"("左括号的话,那么就直接压入存放运算符的堆栈;

3、如果是")"右括号的话,那么就从运算符堆栈中弹数据,并将弹出的数据压入到操作数堆栈中,直到遇到"("为止,这里值得注意的是,"("是必须要从运算符堆栈中弹出的,但是不压入到操作数堆栈,后缀表达式中是不包含括号的;

4、如果是其他符号,就是其他的运算符+-*/这些,那么就:

  a、如果运算符堆栈为空,则直接压入运算符堆栈;

  b、如果不为空且此时运算符堆栈的栈顶元素为括号,包括左括号和右括号,那么也是直接压入运算符堆栈中;

  c、如果此时遍历到的元素的优先级比此时运算符堆栈栈顶元素的优先级高,则直接压入运算符堆栈;

  d、如果正在遍历的元素的优先级和运算符堆栈栈顶的元素的优先级相等或者更小,则需要将栈顶元素弹出并且放到操作数堆栈中,并且将正在遍历的元素压入到运算符堆栈,其实运算符堆栈中的元素顺序就是优先级的顺序;

5、直到遍历完表达式,此时还需要将运算符堆栈中的所有元素压入到操作数堆栈中,算法完成。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

根据以上算法可以得到逆波兰表达式,我们得到逆波兰表达式之后,必须求得正确的计算结果,有了逆波兰表达式,计算起来就攘夷多了,算法如下:

用另一个堆栈来保存数据,从左到右遍历逆波兰表达式:

1、如果是数字,则直接压入堆栈中;

2、如果是运算符(+,-,*,/),则弹出堆栈中的两个数据,进行相应的计算,计算完成之后得到一个数据,然后又压入堆栈中;

3、直到遍历完成,此时堆栈中的数据就是最后计算的结果,简单吧

以上摘自:https://blog.csdn.net/uestclr/article/details/50630906

AC代码:

#include <bits/stdc++.h>
using namespace std;int prio(char x)  //定义优先级
{switch (x){case '+': return 1;case '-': return 1;case '*': return 2;case '/': return 2;default : return 0; //默认会出现括号,而如果有括号都得压进去
    }
}int main()
{int t;cin >> t;while(t--){stack<char>s;stack<double>d;string s1,s2;cin >> s1;int i=0;s2 = "";s.push('#');while(i < s1.length()-1){ // 等于号 不用扫描if('(' == s1[i]){s.push(s1[i++]);}else if(')' == s1[i]){while(s.top() != '('){s2 += s.top();s2 += ' '; //加空格是为了计算时的方便
                    s.pop();}s.pop();//把左括号弹出i++;}else if(s1[i] == '+'||s1[i] == '-'||s1[i] == '*'||s1[i] == '/'){while(prio(s.top()) >= prio(s1[i])){s2 += s.top();s2 += ' ';s.pop();}s.push(s1[i]);i++;}else{//如果是数字类while(s1[i] >= '0'&&s1[i] <= '9'||s1[i] == '.'){s2 += s1[i++];}s2 += ' ';}}while(s.top() != '#'){ //当表达式扫描完,栈中还有剩余符号s2 += s.top();s2 += ' ';s.pop();}//        cout << s2 << endl;double result = 0;i = 0;while(i < s2.length()){switch (s2[i]){case '+':result = d.top();d.pop();result += d.top();d.pop();i++;break;case '-':result = d.top();d.pop();result = d.top() - result;d.pop();i++;break;case '*':result = d.top();d.pop();result *= d.top();d.pop();i++;break;case '/':result = d.top();d.pop();result = d.top()/result;//注意因为是栈,所以除法的顺序发生变化
                    d.pop();i++;break;default:result = 0;double fac = 10.0;while(s2[i] >= '0'&&s2[i] <= '9'){result = result*10 + s2[i] - '0';i++;}if(s2[i++] == '.'){while(s2[i] >= '0'&&s2[i] <= '9'){result += (s2[i] - '0')/fac;fac *= 10;i++;}}}
//            cout << result << endl;
            d.push(result);while(s2[i] == ' '){i++;}}printf("%.2lf\n",d.top());}return 0;
}

——

转载于:https://www.cnblogs.com/cunyusup/p/8931242.html

nyoj35——逆波兰表达式相关推荐

  1. LeetCode实战:逆波兰表达式求值

    题目英文 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  2. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)

    题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...

  3. 数据结构:后缀表达式(逆波兰表达式)

    逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...

  4. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  5. LetCode: 150. 逆波兰表达式求值

    提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...

  6. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  7. 简单计算器 逆波兰表达式

    问题 C: 悠派计算器 时间限制: 1 Sec  内存限制: 128 MB 提交: 7  解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...

  8. 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  9. 逆波兰表达式简单介绍

    逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...

最新文章

  1. 1-runtime的Method,IMP,Property,ivar
  2. C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法...
  3. 里海水位上升的原因_汽轮机真空下降的原因及处理
  4. python timer使用-Python timer定时器两种常用方法解析
  5. opencv 运动目标检测
  6. Java开发中的几种对象的说明(PO,VO,DTO,BO,POJO,DAO,SAO等)
  7. 程序员的灯下黑:重知识轻技术(转)
  8. git命令之:上传到的远程仓库
  9. Varnish3原理学习
  10. python播放音乐-python 模拟(简易)音乐播放器
  11. linux的IO调度算法和回写机制
  12. JDK自带的native2ascii工具完全揭密
  13. 初学者用什么数位板好,手绘板选择注意什么?
  14. PowerShell路转粉之造轮子(01)------B站离线缓存简单合并blvm4s
  15. office 打开wps乱_wps打开word的乱码咋办?
  16. python实现一元二次方程求解_Python实现求解一元二次方程的方法示例
  17. Excel在统计分析中的应用—第十章—方差分析-方差分析表
  18. android 微信 amr转mp3格式,微信amr格式转换器使用教程 如何批量转换微信amr为mp3音频格式文件...
  19. 物理定律告诉你:表白可能巨亏,分手一定血赚
  20. 传奇引擎注册服务器,GeeM2引擎架设传奇不能注册账号 进不去游戏

热门文章

  1. 检测技术再进化:人物交互检测,基于多层次条件网络的方法(ICMR2020)
  2. NeurIPS2021 HRFormer:HRNet又出续作啦!国科大北大MSRA提出高分辨率Transformer,开源!...
  3. 科研项目 | 深度参与前沿课题研究,全英华人教授协会(ABCP)资深学者亲授
  4. CV Code|计算机视觉开源周报20200501期
  5. 安装paddle(飞桨)
  6. Python应该怎么去练习和使用
  7. 你可能不知道的10个Python Pandas的技巧和特性
  8. 【TensorFlow】TensorFlow函数精讲之tf.contrib.layers.flatten()
  9. 9篇!悉尼科技大学入选CVPR2021都研究什么?
  10. NeurIPS2019获奖论文!7篇论文斩获!微软华裔研究员斩获经典论文