我想在我的字符串中执行多个数学运算

时间:2014-02-05 08:36:17

标签: java android string

 string input = "12+5-1";

预期产出为:16

算法应识别运算符(+, - ,*,/),然后在给定数字之间逐个进行操作作为输入。

我最初创建了一个字符串数组

string[] strArrInput = input;

然而有人告诉我,因为字符串已经是字符数组,所以我效率低下。我需要这个逻辑的帮助。

编辑:

顺便说一下,我正在尝试制作一个可以做PEMDAS的科学计算器。

3 个答案:

答案 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