一、简介
前缀表达式、中缀表达式、后缀表达式都是四则运算的表达方式,用以四则运算表达式求值
,即数学表达式的求值。
中缀表达式就是常见的运算表达式,如(3+4)×5-6
前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前,比如:- × + 3 4 5 6
后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后,比如:3 4 + 5 × 6 -
其中,中缀表达式转为前缀和后缀表达式的方法如下。
假设中缀表达式:a+b*c-(d+e)
- 第一步:按照运算符的优先级对所有的运算单位加括号,原式变成:((a+(b*c))-(d+e))
- 第二步:转换前缀与后缀表达式
- 前缀:把运算符号移动到对应的括号前面,则变成:-( +(a *(bc)) +(de)),把括号去掉,前缀式子为: -+a*bc+de。
- 后缀:把运算符号移动到对应的括号后面,则变成:((a(bc)* )- (de)+ )-,把括号去掉, 后缀式子为:abc*-de+-。
二、实验目的
按照逆波兰表达式进行四则运算,至于怎么将中缀表达式转换成后缀表达式,然后再进行运算,我们留在下一节来讲。
三、java代码
package stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/*
任务要求:根据逆波兰表达式,编写计算器代码完成加减乘除运算。
比如:(3+4)*5-6 => 3 4 + 5 * 6 -
*/
public class PolandNotation {
public static void main(String[] args) {
String expression = "3 4 + 5 * 6 -";
List<String> list = reversePolandNotation(expression);
System.out.println(list + " ");
int ans = calculate(list);
System.out.println(expression + ": " + ans);
}
/*
* 1.将字符串形式的逆波兰表达式存储到List中
*/
public static List<String> reversePolandNotation(String expression){
String[] split = expression.split(" ");
List<String> list = new ArrayList<String>();
for(String ele : split) {
list.add(ele);
}
return list;
}
/*
* 2.根据逆波兰表达式直接给计算器进行相应的计算
*/
public static Integer calculate(List<String> list) {
Stack<String> stack = new Stack<String>();
for(String item : list) {
if(item.matches("\\d+")) {
stack.push(item);
for (String x : stack) {
System.out.println(x);
}
}else {
String num2Str = stack.pop();
String num1Str = stack.pop();
int num2 = Integer.parseInt(num2Str),
num1 = Integer.parseInt(num1Str),
ans = 0;
if(item.equals("+")) {
ans = num1 + num2;
}else if(item.equals("-")) {
ans = num1 - num2;
}else if(item.equals("*")) {
ans = num1 * num2;
}else if(item.equals("/")) {
ans = num1 / num2;
}
stack.push("" + ans);
}
}
return Integer.parseInt(stack.pop());
}
}
四、计算结果
原式是(3+4)*5-6,计算结果为