北京大学 程序设计与算法(二)逆波兰表达式

用递归解决递归形式的问题

逆波兰表达式

逆波兰表达式是一种把运算符前置的算数表达式,例如普通的表达式2+3的逆波兰表示法为+2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*3的逆波兰表示法为*+234.本题求解逆波兰表达式的值,其中运算符包括+-*/四个。

输入

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

输出

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

*+11.0 12.0 +24.0 35.0 --à(11.0+12.0)*(24.0+35.0)

重点思路:

逆波兰表达式的定义:

1)      一个数是一个逆波兰表达式,值为该数

2)      “运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式,值为两个逆波兰表达式的值运算的结果

#include<bits/stdc++.h>

#include<cstdio>

#include<cstdlib>

using namespace std;

double exp(){

char s[20];

cin>>s;

switch(s[0]){

case ‘+‘: return exp()+exp();

case ‘-‘: return exp()-exp();

case ‘*‘: return exp()*exp();

case ‘/‘: return exp()/exp();

default: return atof(s);//把字符串类型的数转换为 double

break;

}

}

int main(){

printf("%lf",exp());

return 0;

}

原文地址:https://www.cnblogs.com/Invictus-Gaming/p/12322960.html

时间: 2024-10-14 16:12:06

北京大学 程序设计与算法(二)逆波兰表达式的相关文章

【算法】逆波兰表达式

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

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

本文的主要内容是如何求一个给定的表达式的值,具体思路就是先将普通算术的中缀表达式转化为后缀表达式,这一步用到的算法叫做调度场算法.然后对后缀表达式,也就是逆波兰表达式求值. 题目:http://acm.hdu.edu.cn/showproblem.php?pid=3596 代码:(参考别人的重构) #include <iostream> #include <string.h> #include <stdio.h> #include <math.h> #inc

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

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

C++的逆波兰表达式的求解

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法.逆波兰记法不需要括号来标识操作符的优先级.逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问.逆波兰记法和相应的算法由澳大利亚哲学家.计算机学家查尔斯·汉布林(Charle

波兰、逆波兰表达式

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

递归--练习10--noi1696逆波兰表达式

递归--练习10--noi1696逆波兰表达式 一.心得 递归大法好 二.题目 1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算

逆波兰表达式模型

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

Java解析字符串表达式--逆波兰表达式的计算

问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果.如读入的是"6 * ( 5 + ( 2 + 3) * 8 + 3)",那么解析后的输出结果应为288. 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即"( 5 + ( 2 + 3) * 8 + 3)", 将"2 + 3"的计算结果并存为A,接着用计算"A*8",并存为B 计算"5+B+3",结果存为C 最后计算&q

简单计算机——逆波兰表达式

逆波兰数:逆波兰数由两部分组成(操作数,操作符)--是波兰表达式的一种,即操作符在操作数的后面. 形式:A+B*C-D = ABC*D-; (A+B)*C-D = AB+C*D-; 既然我们知道了,后缀表达式那我们表达式是唯一的吗?我们来看一组数据: 例如:(A+B)*C-D 和 C*(A+B)-D; 很显然第二个的表达式为:C*AB+D-;虽然对最后的结果无影响,但我们需要知道逆波兰的多样性. 注意事项: 1.如果出现1+23 = 123+,该如何判断它的数值呢? 可以利用分割符来进行很好的辅