计算后缀表达式的值: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的对数。

数学计算过程如下


posted @ 2017-07-25 12:05  allMayMight  阅读(188)  评论(0编辑  收藏  举报