RPN表达式
算法描述
- RPN是对算数表达式的一种描述,描述中不含括号
- RPN经常用于虚拟机上,比如JVM
- RPN的书写特点之一是:操作符写在数字之后
- 例如,“3-4” 可以写成 “3 4 -”
- 同样的,“(3 – 4) * 5”可以写成 “3 4 – 5”
- 注意以下,虽然没有括号,单RPN表达式依然没有歧义
- 再比如,“3 – (4 * 5)” 会被写为“3 4 5 * -”
- RPN表达式通过一个栈来计算,表达式总左至右来处理
- 遇到的每个数字被放入到栈中,遇到操作符时,合适的数字从栈中提取出来,进行计算,计算结果再入栈
- 最后,栈的顶部数字就是表达式的值
- RPN支持的运算符包括加(+)、减(-)、乘(*)、负(~)
- 例如,RPN表达式“2 3 + 6 ~ 7 * -”可以按照如下方式计算
Remaining Expression Stack New Stack
2 3 + 6 ~ 7 * - [] [2]
3 + 6 ~ 7 * - [2] [2 3] <---- Stacks grow to the right
+ 6 ~ 7 * - [2 3] [5]
6 ~ 7 * - [5] [5 6]
~ 7 * - [5 6] [5 -6]
7 * - [5 -6] [5 -6 7]
* - [5 -6 7] [5 -42]
- [5 -42] [47] <---- Final answer is 47
- 若是因为RPN表达式构造不合理,你可以返回-999
参数定义
- 类名
RPN
- 方法
evaluate
- 输入参数
string
- 输出
string
- 方法声明
int evaluate(string expr)
限制条件
- expr包含奇数个字符
- expr 的奇数位置是空格
- expr 的偶数位置是[0 – 9] ,或者符号加(+)、减(-)、乘(*)、负(~)
例子
- 输入
- expr: “2 3 + 6 ~ 7 * -“
- 输出
- 47
测试实例
实例一
输入
- ”5 ~ ~ ~”
输出
- -5
实例二
- 输入
- ”9 8 7 * * 4 5 – -“
- 输出
- 505
- 输入
实例三
- 输入
- ”1 + 2 + 3”
- 输出
- -999
- 输入
实例四
- 输入
- ”1 9 ~ 2 8 * +”
- 输出
- -999
- 输入