目录
一、前缀表达式计算机求值算法介绍
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
例如: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 , 针对前缀表达式求值步骤如下:
1)从右至左扫描,将6、5、4、3压入堆栈
2)遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈
3)接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈
4)最后是-运算符,计算出35-6的值,即29,由此得出最终结果
二、前缀表达式计算机求值代码实现
//从右向左扫描
public class PrefixCalculator {
public static void main(String args[]){
String PrefixExperssion="- * + 3 4 5 6";
String[] PrefixExperssionSplit=PrefixExperssion.split(" ");
Stack<String> numStack=new Stack<String>();
PrefixCalculate(PrefixExperssionSplit,numStack);
System.out.println("最后的运算结果为:"+numStack.pop());
//
}
public static void PrefixCalculate(String[] PrefixExperssion,Stack<String> numStack){
// 从右向左扫描
for (int i=PrefixExperssion.length-1;i>=0;i--){
// System.out.println(PrefixExperssionSplit[i]);
if (isNum(PrefixExperssion[i])){
// System.out.println("测试入栈数据"+PrefixExperssionSplit[i]);
numStack.push(PrefixExperssion[i]);
}else {
// 栈顶数字
int num1=Integer.valueOf(numStack.pop());
// 次栈顶数字
int num2=Integer.valueOf(numStack.pop());
String opr=PrefixExperssion[i];
int res=Calculate(num1,num2,opr);
numStack.push(String.valueOf(res));
}
}
}
public static boolean isNum(String str){
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return false;
}else {
return true;
}
}
public static int Calculate(int num1,int num2,String opr){
int res=0;
switch (opr){
case "+":
res=num1+num2;
break;
case "-":
res=num1-num2;
break;
case "*":
res=num1*num2;
break;
case "/":
res=num1/num2;
break;
default:
break;
}
return res;
}
}