1. 程式人生 > >計算字尾表示式的值:JAVA-Stack實現

計算字尾表示式的值: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的對數。

數學計算過程如下