计算后缀表达式的值:JAVA-Stack实现
计算一个后缀表达式的值,首先想到就是可以利用栈来实现。
当见到一个数时,就把数推入到栈中去。
当见到一个运算符时,就把栈顶的两个元素即数字弹出并删除,计算出结果后,再结果这个数推入到栈中。注意就是,先弹出的数(即代码中的a)在运算符的右边,后弹出的数(即代码中的b)在运算符的左边,这样子进行计算。而加减乘除幂+-*/^这五个运算符都符合这样的逻辑。
package three;
import java.util.Scanner;
import java.util.Stack;
public class postfix {
//The following function evaluates a postfix expression, using+, −, ∗, /, and ^ ending in =. It requires
//spaces between all operators and =.
static double evalPostFix()
{
Stack<Double> s = new Stack<Double>();
String token;
Double a, b, result=0.0;//ab是计算过程的中间变量,result是入栈时的变量
boolean isNumber;
Scanner sc = new Scanner(System.in);
token = sc.next();//后缀表达式一个一个输入,当输入了=时,循环结束
while (token.charAt(0) != '=')//每次输入检测字符串的第一个字符是否为=
{
try
{
isNumber = true;
result = Double.parseDouble(token);//若输入字符不是数字,肯定报异常,即让布尔类型为false
}
catch (Exception e)
{
isNumber = false;
}
if (isNumber)//如果是数字,那么就入栈
s.push(result);
else//如果是运算符,那么就栈顶出两个数字,计算后再入栈
{
switch (token.charAt(0))
{//每个case后面都应该有break
case '+': a = s.pop(); b = s.pop();
s.push(b+a); break;
case '-': a = s.pop(); b = s.pop();
s.push(b-a); break;
case '*': a = s.pop(); b = s.pop();
s.push(b*a); break;
case '/': a = s.pop(); b = s.pop();
s.push(b/a); break;
case '^': a = s.pop(); b = s.pop();
s.push(Math.exp(a*Math.log(b)));//这里就相当于b^a
break;
}
}
token = sc.next();
}//当循环结束时,栈里只剩下一个元素
return s.peek();//返回栈顶元素,并不删除
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(evalPostFix());
}
}
程序运行过程注释已经解释得很清楚了。
解释下b^a(即b的a次幂)
程序中这句Math.exp(a*Math.log(b))
Math.exp(x)是指e的x次幂,Math.log(y)是指以e为底数的y的对数。
数学计算过程如下