string input = "12+5-1";
预期产出为:16
算法应识别运算符(+, - ,*,/),然后在给定数字之间逐个进行操作作为输入。
我最初创建了一个字符串数组
string[] strArrInput = input;
然而有人告诉我,因为字符串已经是字符数组,所以我效率低下。我需要这个逻辑的帮助。
编辑:
顺便说一下,我正在尝试制作一个可以做PEMDAS的科学计算器。
答案 0 :(得分:0)
你可以使用内置的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));
}
}
答案 1 :(得分:0)
我使用堆栈编写了一个简单的代码,看看这个。
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;
}
}
你可以使用这样的东西,我没有实现操作数优先级,但我认为你现在可以这样做。
答案 2 :(得分:0)
您可以使用givn String函数解析String。 (indexOf,lastOf,split)但是写一个知道mathematik的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不是减去你必须先写一个+;像这样的呕吐会做:
if(calcValue>0){
setPlus="+";
}else{
setPlus="";
}
input=leftRest+setPlus+Value+rightRest;
给你:
120-40+30
现在你重复,直到没有*,/ 然后你开始搜索+, -
如果你用bigDecimal划分你的东西你必须说你想要多少个逗号值...否则它会为思想提出一个例子,如1/3
如果你想用'()'来做,你必须首先将字符串拆分为'(',')'并在其中进行数学计算,然后将其写回而不用'()'
希望我能帮到你一点,我想还有其他方法可以这样做,但我只需要6h,完全醉了就写下这段代码^^
的Stefan