Evaluar una expresión matemática en Java

Zeeshan Afridi 12 octubre 2023
Evaluar una expresión matemática en Java

Evaluar una expresión matemática usando una pila es una de las opciones más comunes y útiles.

Stack tiene dos métodos estándar, pop() y push(), que se utilizan para poner y obtener operandos u operadores de la pila. El método pop() elimina el elemento superior de la expresión, mientras que el método push() coloca un elemento en la parte superior de la pila.

Evaluar una expresión matemática en Java

Aquí hay un ejemplo en Java para evaluar una expresión matemática. Este código sigue las reglas DMAS adecuadas con la siguiente prioridad: división, multiplicación, suma y resta.

Puede darle cualquier expresión matemática como entrada, pero asegúrese de que la expresión consta de las siguientes cuatro operaciones (suma, multiplicación, división y resta) únicamente.

Código de ejemplo:

package evaluateexpression;

import java.util.Scanner;
import java.util.Stack;

public class EvaluateExpression {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);

    // Creating stacks for operators and operands
    Stack<Integer> operator = new Stack();
    Stack<Double> value = new Stack();

    // Let's create some temparory stacks for operands and operators
    Stack<Integer> tmpOp = new Stack();
    Stack<Double> tmpVal = new Stack();

    // Enter an arthematic expression
    System.out.println("Enter expression");
    String input = scan.next();
    System.out.println(
        "The type of the expression is " + ((Object) input).getClass().getSimpleName());
    input = "0" + input;
    input = input.replaceAll("-", "+-");

    // In the respective stacks store the operators and operands
    String temp = "";
    for (int i = 0; i < input.length(); i++) {
      char ch = input.charAt(i);
      if (ch == '-')
        temp = "-" + temp;
      else if (ch != '+' && ch != '*' && ch != '/')
        temp = temp + ch;
      else {
        value.push(Double.parseDouble(temp));
        operator.push((int) ch);
        temp = "";
      }
    }
    value.push(Double.parseDouble(temp));

    // Create a character array for the operator precedence

    char operators[] = {'/', '*', '+'};

    /* Evaluation of expression */
    for (int i = 0; i < 3; i++) {
      boolean it = false;
      while (!operator.isEmpty()) {
        int optr = operator.pop();
        double v1 = value.pop();
        double v2 = value.pop();

        if (optr == operators[i]) {
          // if operator matches evaluate and store it in the temporary stack
          if (i == 0) {
            tmpVal.push(v2 / v1);
            it = true;
            break;
          } else if (i == 1) {
            tmpVal.push(v2 * v1);
            it = true;
            break;
          } else if (i == 2) {
            tmpVal.push(v2 + v1);
            it = true;
            break;
          }
        } else {
          tmpVal.push(v1);
          value.push(v2);
          tmpOp.push(optr);
        }
      }
      // pop all the elements from temporary stacks to main stacks
      while (!tmpVal.isEmpty()) value.push(tmpVal.pop());
      while (!tmpOp.isEmpty()) operator.push(tmpOp.pop());
      // Iterate again for the same operator
      if (it)
        i--;
    }
    System.out.println("\nResult = " + value.pop());
  }
}

Producción :

Enter expression
2+7*5-3/2
The type of the expression is String

Result = 35.5

Como puede ver en la salida del código anterior, la expresión 2+7*5-3/2 se proporcionó como entrada. Y el programa ha calculado el resultado como 35.5.

Primero dividió 3/2 = 1.5 porque, en las reglas de DMAS, la división tiene la prioridad más alta. Entonces la parte de la multiplicación se calcula como 7*5 = 35.

A continuación, tenemos una suma de 2+35 = 37, y la última parte de la expresión es una resta que es 37 -1.5 = 35.5.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

Artículo relacionado - Java Math