string input = "12+5-1";
預計產出將是:16我想我的字符串中執行多個數學運算
的算法應該識別符(+, - ,*,/),然後通過與一個做操作的一個給定的數字作爲輸入。
我最初創建一個字符串數組
string[] strArrInput = input;
有人建議我不過說我是低效的,那是因爲一個字符串已經是一個字符數組。我需要這個邏輯的幫助。
編輯:
順便說一句,我試圖做一個科學計算器,可以做PEMDAS。
string input = "12+5-1";
預計產出將是:16我想我的字符串中執行多個數學運算
的算法應該識別符(+, - ,*,/),然後通過與一個做操作的一個給定的數字作爲輸入。
我最初創建一個字符串數組
string[] strArrInput = input;
有人建議我不過說我是低效的,那是因爲一個字符串已經是一個字符數組。我需要這個邏輯的幫助。
編輯:
順便說一句,我試圖做一個科學計算器,可以做PEMDAS。
您可以使用內置的JavaScript引擎對於這個..
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine scriptEngine = mgr.getEngineByName("JavaScript");
String expression = "12+5-1";
System.out.println(scriptEngine.eval(expression));
}
}
無法解析符號ScriptEngine –
我一直在使用堆棧做了一個簡單的代碼,看看這個。
import java.util.Scanner;
import java.util.Stack;
public class Evaluate {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String input=sc.next();
Stack<Character> operator;
Stack<Integer> operands;
operands=new Stack<Integer>();
operator=new Stack<Character>();
int res=0,c;
for(int i=0 ; i<input.length() ;i++){
c =input.charAt(i);
if(!isOperator(c)){
res *= 10;
res += c - '0';
}else{
operator.push((char)c);
operands.push(res);
res=0;
}
}
operands.push(res);
int a,b;
char op;
for(; operands.size()>1 ;){
a=operands.pop();
b=operands.pop();
op=operator.pop();
operands.push(result(a,b,op));
}
System.out.println(operands);
}
public static boolean isOperator(int c) {
return c == '+' || c == '-' || c == '*' || c == '\\';
}
public static int result(int a,int b,char c){
if(c=='+')
return a+b;
if(c=='-')
return b-a;
if(c=='*')
return a*b;
else
return b/a;
}
}
你可以使用這樣的東西,我沒有實現操作數優先級,但我認爲你現在可以做到這一點。
您可以使用givn字符串函數解析字符串。 (indexOf,lastOf,split)但寫一個知道數學的algho並不那麼容易。 我已經做了一次(沒有「()」),但有代碼給你。 8 我告訴你,我做了什麼:
我搜索的第一個爲 '*,/' 如
input=120-20*2+30;
左側的givn指數
left=120-20;
right=2+30;
在分割字符串分割我搜索最後的+, - 在右邊第一個 再次將其分割爲givn索引 (leftRest = 120; rightRest = + 30)
現在我走左邊發現價值-20它解析爲BigDecimal(因爲這將要給你的逗號值更好的結果),並解析正確的價值發現爲BigDecimal 2 現在ü可以計算
calcValue=-40=-20 * 2;
寫入值回到字符串,如果calcValue不是負號,你必須在之前寫一個+; somting這樣就可以了:
if(calcValue>0){
setPlus="+";
}else{
setPlus="";
}
input=leftRest+setPlus+Value+rightRest;
,讓U:
120-40+30
現在ürepead直到有沒有*,/ 則u開始搜索+, -
如果妳分割財產以後與bigDecimal你不得不說,你喜歡有多少逗號值...否則它會拋出一個豁免認爲像三分之一
如果你想用'()'做到這一點你必須首先在'(',')'拆分字符串,然後寫入數學,然後寫回無「()」
希望我能幫助你一點,我認爲有其他的方法來做到這一點,但我只需要6小時,完全醉DO編寫代碼^^
斯特凡
問正確的問題,並告訴我們,你到目前爲止做了什麼! – bobbel
效率真的是這裏的問題嗎?如果不是,你應該專注於最優雅的解決方案。 – Magnilex
你可以將這個'String'解析爲一個JavaScript腳本(雙關),並使用像犀牛或'ScriptEngine'這樣的JavaScript引擎來執行它。相關:http://stackoverflow.com/q/7487908/1065197 –