1470 数据结构:逆波兰表达式

本题难点有二:

  其一为波兰表达式递归求值算法的理解;

  其二为处理多组数据,scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.注意exit()与return的区别

关于波兰(前缀)表达式、中缀表达式、逆波兰(后缀)表达式的详细介绍,请参考:http://www.cnblogs.com/chenying99/p/3675876.html

另外,指出本题的一个小错误,应把题目中所有的“逆波兰”改为“波兰”。

// 测试用例:
// * - 2 3 4
// - 3 2
// - 7 7
// * + 11.0 12.0 + 24.0 35.0
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
double Evaluate()//波兰(前缀)表达式递归求值算法,需要好好理解
{
    char a[15];//用于存储每次递归读取的一个非空字符(串)
    if (scanf("%s", &a) == EOF) exit(0);//处理多组数据正常结束的问题
    switch (a[0])
    {
    case ‘+‘: return Evaluate() + Evaluate();
    case ‘-‘: return Evaluate() - Evaluate();
    case ‘*‘: return Evaluate() * Evaluate();
    case ‘/‘: return Evaluate() / Evaluate();
    default: return atof(a);
    }
}
int main(int argc, char const *argv[])
{
    //#ifndef _OJ_  //ONLINE_JUDGE
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    //#endif
    while (1)   printf("%f\n",Evaluate());
    return 0;
}
时间: 2024-10-11 01:12:46

1470 数据结构:逆波兰表达式的相关文章

逆波兰表达式的C实现

复习下数据结构,用栈简单实现逆波兰表达式,参考文档: http://www.nowamagic.net/librarys/veda/detail/2307 http://www.nowamagic.net/librarys/veda/detail/2306 直接上代码: /** *code by lichmama from cnblogs.com *@逆波兰表达式的C实现 *算术支持的运算模式: * 四则运算: * 操作数不得大于9: * 中间数(即运算当中的临时变量)不得超过127 **/ #

c++实现将表达式转换为逆波兰表达式

https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). 样例对于 [3 - 4 + 5]的表达式(该表达式可表示为["3", "-", "4", "+", "5"]),返回 [3 4 - 5 +](该表达式可表示为 ["3", "4&q

波兰、逆波兰表达式

软考习题里遇到了这样一道题,给出了一个逆波兰式,让求它对应的中缀表达式. 逆波兰式:ab-cd+* ,它的中缀表达式是(a-b)*(c+d) 思考: 这让我蒙圈了,这是为什么呢.怎么得到的呢,应该有什么规律的吧. 首先我们要知道: 波兰式:前缀表达式 逆波兰式:后缀表达式 了解这三个表达式之前,我们需要知道 表达式 解释 例子 前缀 不含括号的的算数表达式,将运算符写在前面,操作数写在后面 *+ 2 1 3 中缀 必须含括号,操作符处于操作数的中间 (2+1)*3 后缀 不含括号,运算符放在两个

逆波兰表达式模型

其实这个东西早在7月开始的时候我就写好了,本来想等小师妹写好了她的版本再放到网上的...无奈她写的实在是太慢了.这个东西还是有改进的空间的,比如升级成浮点模型啥的. 逆波兰表达式的可以以O(N)时间复杂度处理任意表达式,其实也叫后缀表达式,中缀表达式(就是我们一般看到的表达式(1+1=2)),处理的时候分两个栈,一个符号栈,一个表达式栈: (注意我只选二元运算符为例,只处理+-*/和括号) 1. 如果遇到数字,压入表达式栈 2. 如果遇到符号 a. 如果符号是左括号,则直接压入符号栈 b. 如果

基于逆波兰表达式的公式解析器-算法和思路(一)

背景: 近期项目须要自己完毕Excel的公式解析和求值,在Java中能够使用POI解析Excel公式然后求值.可是项目须要JS端和Java后端均须要支持公式解析,所以就须要自己写一套了.事实上公式解析器整体上并不复杂.原理使用逆波兰表达式就可了. 难点: 1. 针对复杂的用户输入环境解析公式,须要注意公式书写不规范.大写和小写.空格等问题,甚至公式出错的推断. 2. 须要解决函数扩展.函数运行等问题. 3. 须要解决地址.地址范围取数,求值问题. 4. 处理括号带来的优先级提升. 5. 解决公式

Java解析字符串表达式--逆波兰表达式的生成

上回讲了如何计算后缀表达式,其实真正的难点在于如何将一个正常的字符串表达式(中缀表达式)变成一个后缀表达式.如将6 * ( 5 + ( 2 + 3) * 8 + 3)变为6 5 2 3 + 8 * + 3 + * 逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的中缀表示 逆波兰表达式 a+b a,b,+ a+(b-c) a,b,c,-,+ a+(b-c)*d a,b,c,-,

【算法】逆波兰表达式

表达式一般由操作数(Operand).运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间, 这称为中缀表达式(Infix Expression),如A+B. 波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式: 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB: 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Express

数据结构——逆波兰式

很久没有关注算法和数据结构,大部分知识都已经忘记了:是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度.这不刚看到逆波兰式废了好大劲才搞懂,老了... 逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E本身. (2)如果E是E1 op E2形式的表达式,这里op是如何二元操作符,则E的后缀

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,telnet,+,+,1