我使用Stack类来计算简单的算术表达式,包括整数,如1+2* 3。你的程序将按照给定的顺序执行操作,而不考虑操作符的优先级。* 因此,表达式1+23应该计算为(1+2)3=9,而不是1+(23)=7。如果我得到的输入为1+23,我知道如何将字符串1,2,3转换为Integer。但我不知道如何将+,* 从字符串类型转换为运算符。我的代码逻辑是:例如:给定字符串2 +(3 * 5),因此3 * 5将首先被操作,然后+2将在3 * 5的结果中被执行。
sbtkgmzw1#
可能最好的方法是equals,但最好忽略空格:我不太确定你是如何分割字符串,但是例如,如果你有一个字符op和两个整数a和b:
equals
op
a
b
String str = op.replace(" ", ""); if(str.equals("*")){ retVal = a*b; } else if(str.equals("+")){ retVal = a+b; }//etc
pjngdqdw2#
按照Ogen的建议做,手动检查操作符。一个快速的快捷方式来做if,else if…结构是switch,也就是说
switch(operand) { case "*": break; case "+": break; ..... default: }
htzpubme3#
您必须手动检查并分配操作员。
if (s.equals("+")) { // addition }
mxg2im7a4#
快速解决方案:使用下面的代码在java中执行正确的javascript算术表达式。
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine se = manager.getEngineByName("JavaScript"); try { Object result = se.eval(val); System.out.println(result.toString()); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); }
1hdlvixo5#
好的,假设你的赋值需要使用Stack类,并且你已经有了选择数字(包括负数--除了一种情况外,在所有情况下都是一个运算符后面跟着另一个运算符)和运算符和括号的逻辑,你可以做的如下。如果遇到数字,从堆栈中弹出最后两个元素。弹出的第一个项目将是运算符,下一个将是数字。评估表达式并将其推入堆栈并继续。你可以忽略括号。你也必须处理第一次阅读数字或括号的情况。
8aqjt8rx6#
老实说我也在寻找答案。我想做一个计算器应用程序,所以我试图把一个字符串直接转换成一个操作,但在互联网上找了几个小时后,我什么也没找到,所以我最终自己做了这个程序,因为我是一个初学者,这并不容易。所以这是我的程序,它不使用括号或逗号。你只能使用四个运算符“+ - * /”“但除此之外,一切似乎都在工作。它非常简单,只需从除法开始,取两个数字和表示操作数的字符串,然后将其切成三个字符串,然后用两个数字进行运算,然后用结果替换运算,直到没有除法为止。下面是我的函数orderOp的描述:将调用另一个函数getOp:得到操作的字符串,所以如果你给它“2+4*5/6”,你会得到5/6 cutString:把字符串分成三部分,如果你给它5/6,你会得到一个字符串数组,里面有[“5”,"/",“6”]:接受cutString的数组,并根据arr[1],因此在本例中,“/”将使用
class Operateur{ private static final DecimalFormat decfor = new DecimalFormat("0.00"); public static String Op(String s){ String[] equation = cutString(s); double sol = 0; switch (equation[1]){ case "/": sol = Double.parseDouble(equation[0])/Double.parseDouble(equation[2]); break; case "*": sol = Double.parseDouble(equation[0])*Double.parseDouble(equation[2]); break; case "+": sol = Double.parseDouble(equation[0])+Double.parseDouble(equation[2]); break; case "-": sol = Double.parseDouble(equation[0])-Double.parseDouble(equation[2]); break; } return sol+""; } public static String[] cutString(String s){ String[] arr = new String[0]; if(s.contains("+")){ arr = s.split("((?=[//+])|(?<=[//+]))"); } if(s.contains("-")){ arr = s.split("((?=-)|(?<=-))"); } if(s.contains("*")){ arr = s.split("((?=[//*])|(?<=[//*]))"); } if(s.contains("/")){ arr = s.split("((?=[///])|(?<=[///]))"); } return arr; } public static void orderOp(String equation){ while(equation.contains("/")){ equation = equation.replace(getOp(equation),(decfor.format(Double.parseDouble(Op(getOp(equation))))).replace(',', '.')); } System.out.println("Division :" +equation); while(equation.contains("*")){ equation = equation.replace(getOp(equation),decfor.format(Double.parseDouble(Op(getOp(equation)))).replace(',', '.')); } System.out.println("Multiplication:" +equation); while(equation.contains("+")){ equation = equation.replace(getOp(equation),Op(getOp(equation))); } System.out.println("addition:" +equation); while(equation.contains("-")&& (equation.replaceAll("[^.]", "").length()>1)){ equation = equation.replace(getOp(equation),Op(getOp(equation)).replace(',', '.')); equation = RemoveNegative(equation); System.out.println(equation); } System.out.println("soustraction:" +equation); } public static String getOp(String s){ String r =""; if(s.contains("/")){ int slash = s.indexOf("/"); int first = slash; int last = slash; first -= 1; while((first >= 0)&&(s.charAt(first) != '+')&(s.charAt(first) != '-')&(s.charAt(first) != '*')&(s.charAt(first) != '/')){ first -= 1; } first += 1; last += 1; while((last < s.length())&&(s.charAt(last) != '+')&(s.charAt(last) != '-')&(s.charAt(last) != '*')&(s.charAt(last) != '/')&&(s.charAt(last) != '/')){//&(last >= s.length()) if(last < s.length()) { last += 1; } } r = s.substring(first,last); } else if(s.contains("*")){ int slash = s.indexOf("*"); int first = slash; int last = slash; first -= 1; while((first >= 0)&&(s.charAt(first) != '+')&(s.charAt(first) != '-')&(s.charAt(first) != '*')&(s.charAt(first) != '/')){ first -= 1; } first += 1; last += 1; while((last < s.length())&&(s.charAt(last) != '+')&&(s.charAt(last) != '-')&&(s.charAt(last) != '*')&&(s.charAt(last) != '/')){ if(last < s.length()) { last += 1; } } r = s.substring(first,last); } else if(s.contains("+")){ int slash = s.indexOf("+"); int first = slash; int last = slash; first -= 1; while((first >= 0)&&(s.charAt(first) != '+')&(s.charAt(first) != '-')&(s.charAt(first) != '*')&(s.charAt(first) != '/')){ first -= 1; } first += 1; last += 1; while((last < s.length())&&(s.charAt(last) != '+')&&(s.charAt(last) != '-')&&(s.charAt(last) != '*')&&(s.charAt(last) != '/')){ if(last < s.length()) { last += 1; } } r = s.substring(first,last); } else if(s.contains("-")){ int slash = s.indexOf("-"); int first = slash; int last = slash; first -= 1; while((first >= 0)&&(s.charAt(first) != '+')&(s.charAt(first) != '-')&(s.charAt(first) != '*')&(s.charAt(first) != '/')){ first -= 1; } first += 1; last += 1; while((last < s.length())&&(s.charAt(last) != '+')&&(s.charAt(last) != '-')&&(s.charAt(last) != '*')&&(s.charAt(last) != '/')){ if(last < s.length()) { last += 1; } } r = s.substring(first,last); } return r; } public static String RemoveNegative(String s){ s = s.replace("-+","-"); s = s.replace("+-","-"); if(s.charAt(0) == '-'){ s = s.replaceFirst("-",""); s = s.replace("-","+"); while(s.contains("+")){ s = s.replace(getOp(s),Op(getOp(s))); } s = "-"+s; } return s; }
}
6条答案
按热度按时间sbtkgmzw1#
可能最好的方法是
equals
,但最好忽略空格:我不太确定你是如何分割字符串,但是例如,如果你有一个字符
op
和两个整数a
和b
:pjngdqdw2#
按照Ogen的建议做,手动检查操作符。一个快速的快捷方式来做if,else if…结构是switch,也就是说
htzpubme3#
您必须手动检查并分配操作员。
mxg2im7a4#
快速解决方案:使用下面的代码在java中执行正确的javascript算术表达式。
1hdlvixo5#
好的,假设你的赋值需要使用Stack类,并且你已经有了选择数字(包括负数--除了一种情况外,在所有情况下都是一个运算符后面跟着另一个运算符)和运算符和括号的逻辑,你可以做的如下。
如果遇到数字,从堆栈中弹出最后两个元素。弹出的第一个项目将是运算符,下一个将是数字。评估表达式并将其推入堆栈并继续。
你可以忽略括号。你也必须处理第一次阅读数字或括号的情况。
8aqjt8rx6#
老实说我也在寻找答案。我想做一个计算器应用程序,所以我试图把一个字符串直接转换成一个操作,但在互联网上找了几个小时后,我什么也没找到,所以我最终自己做了这个程序,因为我是一个初学者,这并不容易。所以这是我的程序,它不使用括号或逗号。你只能使用四个运算符“+ - * /”“但除此之外,一切似乎都在工作。
它非常简单,只需从除法开始,取两个数字和表示操作数的字符串,然后将其切成三个字符串,然后用两个数字进行运算,然后用结果替换运算,直到没有除法为止。
下面是我的函数orderOp的描述:将调用另一个函数getOp:得到操作的字符串,所以如果你给它“2+4*5/6”,你会得到5/6 cutString:把字符串分成三部分,如果你给它5/6,你会得到一个字符串数组,里面有[“5”,"/",“6”]:接受cutString的数组,并根据arr[1],因此在本例中,“/”将使用
}