波兰表达式

描述

逆波兰表达式,英文为 Reverse Polish notation,跟波兰表达式(Polish notation)相对应。之所以叫波兰表达式和逆波兰表达式,是为了纪念波兰的数理科学家 Jan Łukasiewicz。其在著作中提到:

我在1924年突然有了一个无需括号的表达方法,我在文章第一次使用了这种表示法。

  • 平时我们习惯将表达式写成 (1 + 2) * (3 + 4),加减乘除等运算符写在中间,因此称呼为中缀表达式。
  • 而波兰表达式的写法为 (* (+ 1 2) (+ 3 4)),将运算符写在前面,因而也称为前缀表达式。
  • 逆波兰表达式的写法为 ((1 2 +) (3 4 +) *),将运算符写在后面,因而也称为后缀表达式。

波兰表达式和逆波兰表达式有个好处,就算将圆括号去掉也没有歧义。上述的波兰表达式去掉圆括号,变为* + 1 2 + 3 4。逆波兰表达式去掉圆括号,变成1 2 + 3 4 + *也是无歧义并可以计算的。事实上我们通常说的波兰表达式和逆波兰表达式就是去掉圆括号的。而中缀表达式,假如去掉圆括号,将 (1 + 2)(3 + 4) 写成 1 + 23 + 4,就改变原来意思了。

(作者:黄兢成链接:https://www.zhihu.com/question/41103160/answer/452481026来源:知乎)

(2 + 3) * 4`的波兰表示法为`* + 2 3 4

请写程序求解波兰表达式的值。

本题输入的运算符只包括如下4个运算符:+ - * /

输入

输入为一行波兰表达式,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值。

可直接用printf("%f\n", v)输出表达式的值v。

样例

* + 11.0 12.0 + 24.0 35.0
1357.000000

难度

中,栈 and 递归

代码

code by guowei

code by me

#include <bits/stdc++.h>  //万能头文件
using namespace std;
stack<double>st;
double compute(double a,double b,string  c){if(c=="+"){return a+b;}else if(c=="-"){return a-b;}else if(c=="*"){return a*b;}else{return a*1.0/b;}
}
int main()
{string s[31];int i=0;double a,b;int flag=0;while(cin>>s[i]){i++;}for(int j=i-1; j>=0; --j){if(s[j]=="+"||s[j]=="-"||s[j]=="*"||s[j]=="/")//遇到符号从栈中弹出两个个值{a = st.top();st.pop();b = st.top();st.pop();st.push(compute(a,b,s[j]));}else  //如果是操作数就转换成数压栈{st.push(atof(s[j].c_str()));}}printf("%.6f",st.top());return 0;
}

算法实践:波兰表达式相关推荐

  1. 24点算法 | 逆波兰表达式实现去重复

    git: https://github.com/wusuopubupt/hack/tree/master/points24 参考: 1.czxttkl : http://maider.blog.soh ...

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

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

  3. 调度场算法与逆波兰表达式

    本文的主要内容是如何求一个给定的表达式的值,具体思路就是先将普通算术的中缀表达式转化为后缀表达式,这一步用到的算法叫做调度场算法.然后对后缀表达式,也就是逆波兰表达式求值. 题目:http://acm ...

  4. 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...

    最终计算器的掩饰效果,欢迎大家来找BUG. http://codepen.io/lvanboy/full/LxKVxJ/ 功能: 1.按照运算符的优先级运算 2.利用上次的结果继续运算 3.多个数字混 ...

  5. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  6. 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值

    栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...

  7. 【数据结构与算法】之深入解析“逆波兰表达式求值”的求解思路与算法示例

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

  8. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

    题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...

  9. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

  10. java 逆波兰_逆波兰表达式算法-Java版

    这两天一直在看数据结构,栈这个地方,基础的就是这个逆波兰表达式,看了很多博文,都讲得不清不楚或者只能计算一个位的数字,决定自己写,这篇博文给了很大启发–>Go New Land AND Here ...

最新文章

  1. python调试神器_介绍一款调试Python的神器
  2. Linux进程通信之文件
  3. SpringBoot2 集成 xxl-job任务调度中心_参数传递
  4. MapXtreme 2005新增内容
  5. 骆俊武:五年了,我的技术管理成长之路
  6. CNN提取文本特征,融合PMF模型实现推荐系统
  7. 多面集的表示定理 (Representation / Resolution / Caratheodory theorem of polyhedral Sets)
  8. JAVA基础语法——关键字
  9. U盘插入苹果电脑后被分区,在Windows系统用不了怎么办。
  10. python爬虫框架论文开题报告范文_基于Scrapy的分布式网络爬虫的设计与实现.doc...
  11. 黑客能篡改WiFi密码,源于存在漏洞
  12. html颜色怎么渐变效果,html怎么设置颜色渐变
  13. Excel中文转拼音(完整版)-转
  14. 【PhpSpreadsheet】实现excel冻结列和行(即左右滚动时指定列和行固定不动)
  15. 基于C语言的信息管理系统和小游戏
  16. 基于soap 的 python web services 服务开发指南
  17. 《异星歧途》,特别有意思的一个故事
  18. 阿里携“骑呗”入局共享单车,好戏即将开始
  19. 百度前端笔试题 css3画三角形
  20. BeautifulSoup解析豆瓣即将上映的电影信息

热门文章

  1. canvas 角度 弧度 换算
  2. IDEA修改快捷键方法(在原快捷键不变的基础上增加自己习惯的快捷键)
  3. 一根均线选股法_一根足以,万能均线买卖法!(实战干货)
  4. Ubuntu系统下python编程入门
  5. goap git上的v sploreg/goap
  6. [Azure] 取消 或 删除Azure云订阅服务
  7. IDEA 错误: 找不到或无法加载主类 com.Main
  8. 公共场合的wifi 靠不住
  9. 一步教你如何开通支付宝手机网站支付,微信h5收款,降低支付宝当面付费率
  10. 读王阳明二知行合一2有感