1 基本信息
1.1 表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
1.2 用途
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)(c+d)转换为ab+cd+
1.3 优先级
优先级分为栈内优先级isp(In stack priority)和栈外优先级icp(In coming priority)。除了括号以外,其他运算符进栈后优先级都升1,这样可以体现在中缀表达式中相同优先级的操作符自左向右计算的要求,让位于栈顶的操作符先退栈并输出。
2 后缀表达式求值以及如何实现
Knuth 将此概括为三个步骤:
1. 对中缀表达式进行语法分析
2. 中缀表达式到后缀表达式的转换
3. 对后缀表达式求值
3 Java语言实现
/**
* @description 逆波兰表达式法
* @author Guan
* @date 2016-10-15 下午2:07:21
* @version 1.0
*/
public class ReversePolishNotation {
/**
* 测试的main方法
*/
@SuppressWarnings("rawtypes")
public static void main(String arg[]) {
String s = "9+(3-1)*3+10/2";
ArrayList postfix = transform(s);
for (int i = 0, len = postfix.size(); i < len; i++) {
System.out.println(postfix.get(i));
}
calculate(postfix);
}
/**
* 将中缀表达式转换成