後綴表達式二

上一篇解釋怎樣將一箇中最表達式轉換成後綴表達式,那麼轉換出來的後綴表達式有什麼作用呢,今天首先研究如何計算一個後綴表達式是的值。

規則:

      從後綴表達式的左邊到右邊依次讀取一個字符

     1、如果是操作數,則壓棧

     2、如果是操作符,則從棧中彈出兩個操作數,用後一個出棧的作爲前操作數,先出棧的作爲第二個操作數,採用這個操作符計算,計算結果壓棧

      3、如果字符串遍歷完畢,棧中元素出棧,便是結果

代碼表示:

     import java.util.Stack;


public class InfixCalculate {
String inputStr;
Stack<Double> mStack;
public InfixCalculate(String inputStr) {
super();
this.inputStr = inputStr;
mStack = new Stack<Double>();
doCalculate();
}
private void doCalculate() {
for(int i =0;i<inputStr.length();i++){
char c= inputStr.charAt(i);
switch (c) {
case '+':
case '-':
case '*':
case '/':
doOptions(c);
break;
default:
doNumbers(c);
break;
}
}
System.out.println("res="+mStack.pop());
}
//操作符
private void doOptions(char c) {
double num2 = mStack.pop();
double num1 = mStack.pop();
System.out.println(num2+"和"+num1+"出棧");
double res = 0;
switch (c) {
case '+':
res = num1+num2;
System.out.println("計算"+num1+"+"+num2+"="+res);
break;
case '-':
res = num1-num2;
System.out.println("計算"+num1+"-"+num2+"="+res);
break;
case '*':
System.out.println("計算"+num1+"*"+num2+"="+res);
res = num1*num2;
break;
case '/':
System.out.println("計算"+num1+"/"+num2+"="+res);
res = num1/num2;
break;

default:
break;
}
mStack.push(res);
System.out.println(res+"入棧");
}
//操作數
private void doNumbers(char c) {
mStack.push(Double.parseDouble(c+""));
System.out.println(c+"入棧");
}

}

    到這裏後綴表達式的優勢就完全體現出來了 ,採用後綴是的計算式,運算結果的時候完全不用考慮操作符的優先性,大大減少了計算成本。

    另外,此處的操作數均是採用一位數,如果操作數的位數大於等於二,那麼纔讀取操作數的時候就不能每次讀取一個字符。而是每次讀取一個操作數,此時可以採用面向對象的思維定義一個草所述對象。這樣每次讀取一個操作數就是每次讀取一個對象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章