表示式求值的java實現

2021-09-01 04:48:24 字數 2218 閱讀 7463

對整數表示式求值. 表示式中可能包含+-*/四則運算, 以及括號, 比如:4 + 2 * 3 - 10 / 5, (1+2) * (4 + 5) - (9 / 7)等.

思路: 將括號之間的內容當做子表示式求值, 得出子表示式的結果後就可以去掉括號了.

使用optr棧儲存運算子, opnd棧儲存運算元. 解析表示式, 如果得到運算元就存入opnd棧中, 如果得到運算子, 就根據所得的運算子和optr棧頂運算子的優先順序比較結果, 進行相應的操作.

1. 定義優先順序和優先順序表

/**

* 運算子優先權

*/public enum precede else

}} }

/*** 判斷2個運算子的優先順序

*/public static precede judgeprecede(char operand1, char operand2)

/*** 獲取運算子對應的陣列索引

*/private static int getindex(char operand)

}}

2. 表示式求值

/**

* 整數表示式運算

*/public class evaluateexpression

/*** 求值

*/public integer evaluate()

if (expression.matches("^-?\\d+.*$") && numbernext) else else

// 優先順序低時運算前乙個運算元和後乙個運算元

case less: }}

}} // 運算結果

integer result = null;

if (optr.length() == 0 && opnd.length() == 1) else if (optr.length() == 1 && opnd.length() == 2) else

return result;

} /**

* 進行實際的運算,並將結果入棧

*/private void evaluatenow(integer last, character operand, integer next)

} /**

* 獲得表示式開頭部分的整數

*/private integer getinteger()

int i = (lesszero ? 1 : 0);

for (; i < expression.length(); i++) else

} expression = expression.substring(count);

numbernext = false;

return integer.valueof(sb.tostring());

} /**

* 處理括號. 將括號內的字串作為子表示式計算.

*/private void handleparentheses()

} else if (c == '(') else

}// 左右括號之間是乙個子表示式, 計算子表示式的值,並根據結果構造出新的表示式

evaluateexpression evaluateexpression = new evaluateexpression(expression.substring(left + 1, right));

expression = expression.substring(0, left) + evaluateexpression.evaluate()

+ expression.substring(right + 1);

} }/**

* 刪除表示式中的空白字元

*/private void delblank()

@override

public string tostring()

}

3. 進行測試

@test

public void testevaluate()

測試的結果為:

1 + 2  = 3

4 + 2 * 3 - 10 / 5 = 8

(1+2) * (4 + 5) - (9 / 7) = 26

(1 + (3 * (4 - 9))) = -14

(1 + (3 * (4 - 9))) + (3 * (2 + 3)) = 1

可見結果是正確的.

java 棧實現中綴表示式求值

思路分析 利用棧這個資料結構先入後出的特點。利用兩個棧乙個數字棧,乙個符號棧。實現計算。1.遍歷表示式的每個字元,如果是數字就入數棧。注意數字可能是多位數,所以在讀數字是要合併一下連續的數字,知道下個符號出現。2.讀到的是符號時,先判斷符號棧是否為空,如果為空就直接入符號棧。如果不為空則判斷優先順序...

表示式求值的實現

表示式求值是乙個很有意思的技術話題,國內外討論這個話題的技術人員很多,也有非常多的實現方案。倒不是說這個問題很難解決,只是說它提供了很好的話題,讓各路高手使用自己的手段來解決問題,百家爭鳴,各展所長。該話題也提供了乙個非常好的想像空間讓大家一起討論技術討論方案,也是乙個資料結構教程中的經典教育案例。...

字尾表示式實現表示式求值

看到別人寫的乙個表示式求值程式,想到很久之前寫的乙個。中間有個字串轉數值型,可以用stringstream來實現或者c語言裡面的strtod直接得到 include include include include includeusing namespace std class data doubl...