計算字尾表示式的值:JAVA-Stack實現
阿新 • • 發佈:2019-02-08
計算一個字尾表示式的值,首先想到就是可以利用棧來實現。
當見到一個數時,就把數推入到棧中去。
當見到一個運算子時,就把棧頂的兩個元素即數字彈出並刪除,計算出結果後,再結果這個數推入到棧中。注意就是,先彈出的數(即程式碼中的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的對數。
數學計算過程如下