上一篇解释怎样将一个中最表达式转换成后缀表达式,那么转换出来的后缀表达式有什么作用呢,今天首先研究如何计算一个后缀表达式是的值。
规则:
从后缀表达式的左边到右边依次读取一个字符
1、如果是操作数,则压栈
2、如果是操作符,则从栈中弹出两个操作数,用后一个出栈的作为前操作数,先出栈的作为第二个操作数,采用这个操作符计算,计算结果压栈
3、如果字符串遍历完毕,栈中元素出栈,便是结果
代码表示:
import java.util.Stack;
public class InfixCalculate {
String inputStr;
Stack<Double> mStack;
public InfixCalculate(String inputStr) {
super();
this.inputStr = inputStr;
mStack = new Stack<Double>();
doCalculate();
}
private void doCalculate() {
for(int i =0;i<inputStr.length();i++){
char c= inputStr.charAt(i);
switch (c) {
case '+':
case '-':
case '*':
case '/':
doOptions(c);
break;
default:
doNumbers(c);
break;
}
}
System.out.println("res="+mStack.pop());
}
//操作符
private void doOptions(char c) {
double num2 = mStack.pop();
double num1 = mStack.pop();
System.out.println(num2+"和"+num1+"出栈");
double res = 0;
switch (c) {
case '+':
res = num1+num2;
System.out.println("计算"+num1+"+"+num2+"="+res);
break;
case '-':
res = num1-num2;
System.out.println("计算"+num1+"-"+num2+"="+res);
break;
case '*':
System.out.println("计算"+num1+"*"+num2+"="+res);
res = num1*num2;
break;
case '/':
System.out.println("计算"+num1+"/"+num2+"="+res);
res = num1/num2;
break;
default:
break;
}
mStack.push(res);
System.out.println(res+"入栈");
}
//操作数
private void doNumbers(char c) {
mStack.push(Double.parseDouble(c+""));
System.out.println(c+"入栈");
}
}
到这里后缀表达式的优势就完全体现出来了 ,采用后缀是的计算式,运算结果的时候完全不用考虑操作符的优先性,大大减少了计算成本。
另外,此处的操作数均是采用一位数,如果操作数的位数大于等于二,那么才读取操作数的时候就不能每次读取一个字符。而是每次读取一个操作数,此时可以采用面向对象的思维定义一个草所述对象。这样每次读取一个操作数就是每次读取一个对象。