java - 如何编写程序根据数学运算顺序进行计算? ( java )

标签 java string for-loop arraylist calculator

我正在尝试用 Java 编写一个程序,该程序接受输入字符串值 像s =“1+27-63*5/3+2”并返回整数值的计算

下面是我的代码

package numberofcharacters;
import java.util.ArrayList;
public class App {
    public static void main(String[] args) {
        String toCalculate = "123+98-79÷2*5";
        int operator_count = 0;  
        ArrayList<Character> operators = new ArrayList<>();
        for (int i=0; i < toCalculate.length(); i++){
             if (toCalculate.charAt(i) == '+' || toCalculate.charAt(i) == '-' ||
                 toCalculate.charAt(i) == '*' || toCalculate.charAt(i) == '÷' ) {
             operator_count++;  /*Calculating
                                  number of operators in a String toCalculate
                                */
             operators.add(toCalculate.charAt(i)); /* Adding that operator to 
                                                    ArrayList*/
         }
     }
     System.out.println("");
     System.out.println("Return Value :" );

     String[] retval = toCalculate.split("\\+|\\-|\\*|\\÷", operator_count + 1);    

    int num1 = Integer.parseInt(retval[0]);
    int num2 = 0;
    int j = 0;
    for (int i = 1; i < retval.length; i++) {

        num2 = Integer.parseInt(retval[i]);
        char operator = operators.get(j);
        if (operator == '+') {
            num1 = num1 + num2;

        }else if(operator == '-'){
            num1 = num1 - num2;
        }else if(operator == '÷'){
            num1 = num1 / num2;
        }else{
            num1 = num1 * num2;
        }
        j++;            
    }
    System.out.println(num1);   // Prints the result value
    }

}

****问题是我需要根据数学运算的顺序执行计算,例如首先是乘法和除法,然后是加法和减法。 我该如何解决这个问题? ****

我使用 String split() 方法在出现运算符“+-/*”的地方分隔字符串。我已经使用字符ArrayList在其中添加运算符。 与代码的最后部分相比,我在分割字符串数组中进行循环,并通过将分割字符串数组的第一个值解析为整数来初始化 int num1 。和 int num2 与第二个值和使用运算符 arraylist 在它们之间执行计算(无论 arraylist 索引处的运算符是什么)。并将结果存储在 int num1 中,反之亦然,直到字符串数组末尾。

[P.S] 我尝试使用 Collection.sort 但它按 [*、+、-、/] 的顺序对上面的运算符数组列表进行排序。它将除法放在最后,而应该将除法放在乘法符号之后或之前

最佳答案

如果您想使用大致相同的代码结构来完成此操作,而不是首先将其转换为逆波兰表示法之类的东西,您可以尝试一种以相反优先级顺序处理操作的方法。

因此,假设您将 */ 视为最高优先级,并且您将它们视为同等优先级,因此要从左到右处理;对于 +- 也是如此;那么你就会

  1. 首先在 +- 上拆分。
  2. 评估由 +- 分隔的部分,但现在处理左侧的 */ -从右顺序。
  3. +- 应用于这些评估的部分。

因此,如果您的表达式是 3*4+5-6/2 那么您的代码将首先分为

3*4  +  5  -  6/2

现在计算这些子表达式

12  +  5  -  3

现在从左到右处理以评估最终答案

14

更一般地说,表达式所需的传递次数取决于您拥有的优先级数量;并且您需要从最低到最高处理优先级。拆分表达式;递归地评估子表达式,仅考虑下一个优先级及以上优先级;结合起来得到最终答案。

这将是一个很好的 Java 8 流小练习!

关于java - 如何编写程序根据数学运算顺序进行计算? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34904895/

相关文章:

java - Java中ElasticSearch中的字段搜索?

java - 增强的 for 循环性能

performance - 比较记录结果和 Double For 循环

java - Groovy 使用反射读取特征方法

java - 线程中断有时有效有时无效

java - 时间格式怎么样?转换时间戳

java - 如何忽略大小写并考虑字母数字字符

python - 如何防止 for 循环在 Python 中前进?

java - 转换 JSON 结构

python - 长度为 k 的非重叠子串的随机采样