表示式計算原始碼JAVA實現 (轉)
支援運算子:+-*/%>
支援:sqrt,square, ceil,sin,cos,asin,acon.tan.atan,log,exp具體含義見calFunction程式碼
計算原始碼:
import .util.Stack;
import java.util.regex.*;
public class BaseExpression {
public static String OPTS = "+-*/%> public calculate(String expression) throws ExpressionException{
try
{
Stack Opts = new Stack();
Stack Values = new Stack();
String e= expression + "#";
int nCount = exp.length(), nIn, nOut, nTemp;
Opts.push("#");
String temp = "", optOut = "", optIn = "", value1 = "", value2 = "",
optTemp = "", opt = "", temp1 = "";
int nFun = 0;
boolean iun = false;
for (int i = 0; i < nCount; ) {
nTemp = 0;
opt = exp.substring(i, i + 1);
isFun = false;
temp1 = "";
while (i < nCount) {
if (!temp1.equals("")) {
if (opt.equals("(")) {
nFun++;
isFun = true;
}
else if (opt.equals(")")) {
nFun--;
}
}
if ( (nFun > 0) || ( (!isFun) && this.isValue(opt))) {
temp1 += opt;
nTemp++;
opt = exp.substring(i + nTemp, i + nTemp + 1);
}
else {
if (isFun) {
temp1 += opt;
nTemp++;
}
break;
}
}
if (temp1.equals("")) {
temp = opt;
}
else {
temp = temp1;
}
if (nTemp > 0) {
i = i + nTemp - 1;
}
temp = temp.trim();
if (this.isValue(temp)) {
temp = this.getValue(temp);
Values.push(temp);
i++;
}
else {
optIn = Opts.pop().toString();
nIn = this.getOptPriorityIn(optIn);
nOut = this.getOptPriorityOut(temp);
if (nIn == nOut) {
i++;
}
else if (nIn > nOut) {
String ret = "";
value1 = Values.pop().toString();
value2 = Values.pop().toString();
ret = String.valueOf(this.calValue(value2, optIn, value1));
Values.push(ret);
}
else if (nIn < nOut) {
Opts.push(optIn);
Opts.push(temp);
i++;
}
}
}
return Values.pop();
}
catch(ExpressionException eE)
{
throw eE;
}
catch(Exception e)
{
throw new ExpressionException("表示式" + expression + "格式!");
}
}
protected int getOptPriorityOut(String opt) throws ExpressionException{
if (opt.equals("+")) {
return 1;
}
else if (opt.equals("-")) {
return 2;
}
else if (opt.equals("*")) {
return 5;
}
else if (opt.equals("/")) {
return 6;
}
else if (opt.equals("%")) {
return 7;
}
else if (opt.equals(">")) {
return 11;
}
else if (opt.equals(" return 12;
}
else if (opt.equals("]")) {
return 13;
}
else if (opt.equals("[")) {
return 14;
}
else if (opt.equals("!")) {
return 15;
}
else if (opt.equals("|")) {
return 16;
}
else if (opt.equals("&") )
{
return 23;
}
else if (opt.equals("=") )
{
return 25;
}
else if ( opt.equals("#"))
{
return 0;
}
else if (opt.equals("(")) {
return 1000;
}
else if (opt.equals(")")) {
return -1000;
}
throw new ExpressionException("運算子" + opt + "非法!");
}
protected int getOptPriorityIn(String opt) throws ExpressionException{
if (opt.equals("+")) {
return 3;
}
else if (opt.equals("-")) {
return 4;
}
else if (opt.equals("*")) {
return 8;
}
else if (opt.equals("/")) {
return 9;
}
else if (opt.equals("%")) {
return 10;
}
else if (opt.equals(">")) {
return 17;
}
else if (opt.equals(" return 18;
}
else if (opt.equals("]")) {
return 19;
}
else if (opt.equals("[")) {
return 20;
}
else if (opt.equals("!")) {
return 21;
}
else if (opt.equals("|")) {
return 22;
}
else if( opt.equals("&") )
{
return 24;
}
else if( opt.equals("=") )
{
return 26;
}
else if (opt.equals("(")) {
return -1000;
}
else if (opt.equals(")")) {
return 1000;
}
else if (opt.equals("#")) {
return 0;
}
throw new ExpressionException("運算子" + opt + "非法!");
}
protected String getOPTS()
{
return OPTS;
}
protected boolean isValue(String cValue) {
String notValue = this.getOPTS() + "()";
return notValue.indexOf(cValue) == -1;
}
protected boolean isOpt(String value) {
return this.getOPTS().indexOf(value) >= 0;
}
protected double calValue(String value1, String opt, String value2) throws ExpressionException{
try
{
double Value1 = Double.valueOf(value1).doubleValue();
double dbValue2 = Double.valueOf(value2).doubleValue();
long lg = 0;
if (opt.equals("+")) {
return dbValue1 + dbValue2;
}
else if (opt.equals("-")) {
return dbValue1 - dbValue2;
}
else if (opt.equals("*")) {
return dbValue1 * dbValue2;
}
else if (opt.equals("/")) {
return dbValue1 / dbValue2;
}
else if (opt.equals("%")) {
lg = (long) (dbValue1 / dbValue2);
return dbValue1 - lg * dbValue2;
}
else if (opt.equals(">")) {
if (dbValue1 > dbValue2)
return 1;
else
return 0;
}
else if (opt.equals(" if (dbValue1 < dbValue2)
return 1;
else
return 0;
}
else if (opt.equals("]")) {
if (dbValue1 >= dbValue2)
return 1;
else
return 0;
}
else if (opt.equals("[")) {
if (dbValue1 <= dbValue2)
return 1;
else
return 0;
}
else if (opt.equals("!")) {
if (dbValue1 != dbValue2)
return 1;
else
return 0;
}
else if (opt.equals("|")) {
if (dbValue1 > 0 || dbValue2 > 0)
return 1;
else
return 0;
}
else if (opt.equals("&")) {
if (dbValue1 > 0 && dbValue2 > 0)
return 1;
else
return 0;
}
else if (opt.equals("=")) {
if (dbValue1 == dbValue2)
return 1;
else
return 0;
}
}catch(Exception e)
{
throw new ExpressionException("值" + value1 + "或" + value2 + "在進行" + opt + "運算時非法!");
}
throw new ExpressionException("運算子" + opt + "非法!");
}
protected String getValue(String oldValue) throws ExpressionException{
String reg = "^([a-zA-Z0-9_]+)(([a-zA-Z0-9_.()]+))$";
if (this.isFunctionCal(oldValue)) {
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(oldValue);
m.find();
return calFunction(m.group(1), m.group(2));
}
return oldValue;
}
protected boolean isFunctionCal(String value) {
String reg = "^([a-zA-Z0-9_]+)(([a-zA-Z0-9_.()]+))$";
return value.matches(reg);
}
protected String calFunction(String function, String value) throws ExpressionException{
String lowerFun = function.toLowerCase();
double db = 0;
try
{
db = Double.valueOf(this.getValue(value)).doubleValue();
if (lowerFun.equals("log")) {
return String.valueOf(Math.log(db));
}
else if (lowerFun.equals("square")) {
return String.valueOf(Math.pow(db, 2));
}
else if (lowerFun.equals("sqrt")) {
return String.valueOf(Math.sqrt(db));
}
else if (lowerFun.equals("sin")) {
return String.valueOf(Math.sin(db));
}
else if (lowerFun.equals("asin")) {
return String.valueOf(Math.asin(db));
}
else if (lowerFun.equals("cos")) {
return String.valueOf(Math.cos(db));
}
else if (lowerFun.equals("tan")) {
return String.valueOf(Math.tan(db));
}
else if (lowerFun.equals("atan")) {
return String.valueOf(Math.atan(db));
}
else if (lowerFun.equals("ceil")) {
return String.valueOf(Math.ceil(db));
}
else if (lowerFun.equals("exp")) {
return String.valueOf(Math.exp(db));
}
}catch(Exception e)
{
throw new ExpressionException("函式" + function + "值" + value + "非法!");
}
throw new ExpressionException("函式" + function + "不支援!");
}
public static void main(String[] args)
{
BaseExpression be = new BaseExpression();
String exp = "sin(ceil(sqrt(100)))*29+20+30*3+0|0|1+1&1*5+2=2";
try
{
System.out.println(be.calculate(exp));
}
catch(ExpressionException eE)
{
System.out.println(eE.getMessage());
}
}
}
表示式異常類程式碼:
public class ExpressionException extends Exception{
public ExpressionException(String msg)
{
super(msg);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962675/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用RMI實現基於Java的分散式計算(轉)Java分散式
- c++虛擬函式實現計算表示式子C++函式
- 計算廣告實現入門-索引布林表示式索引
- 使用棧實現表示式求值,運用棧計算
- 將算數表示式轉換成字尾表示式並計算結果
- 表示式編譯計算器(下) (轉)編譯
- js實現四則計算(中綴,字尾表示式)JS
- 百行以內實現複雜數學表示式計算
- 計算中綴表示式
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- 中綴轉字尾表示式思路分析和程式碼實現
- Java計算器(使用逆波蘭表示式演算法)Java演算法
- 表示式計算 用棧完成
- PostgreSQL 原始碼解讀(160)- 查詢#80(如何實現表示式解析)SQL原始碼
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 教你如何在C++中實現中綴表示式轉字尾表示式C++
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 表示式計算(棧的應用)
- Vue原始碼學習(十七):實現computed計算屬性Vue原始碼
- C#將運算字串直接轉換成表示式且計算結果C#字串
- java實現url轉碼、解碼Java
- python--表示式(運算表示式)Python
- 在Java中實現浮點數的精確計算 (轉)Java
- 一個數學表示式的計算
- PG 中表示式的計算順序
- [原始碼解析] PyTorch 流水線並行實現 (6)--平行計算原始碼PyTorch並行
- 正規表示式(程式碼java版)Java
- Zepto 原始碼分析 3 - qsa 實現與工具函式設計原始碼函式
- <七>lambda表示式實現原理
- .NET實現解析字串表示式字串
- JS實現正規表示式JS
- Java java.util.HashMap實現原理原始碼分析JavaHashMap原始碼
- 計算Java日期 (轉)Java
- 在JAVA中使用正規表示式 (轉)Java
- 使用棧結構計算中綴表示式
- [原始碼解析] PyTorch 流水線並行實現 (4)--前向計算原始碼PyTorch並行
- Red Hat計劃公開Java原始碼 (轉)Java原始碼
- 兩行程式碼輕鬆讓 Java 實現大文字平行計算行程Java