(LC) 150. Evaluación de la expresión polaca inversa

150. Evaluación de la expresión polaca inversa

De acuerdo con la notación polaca inversa, encuentre el valor de la expresión.

Los operadores válidos incluyen +, -, *, /. Cada operando puede ser un número entero u otra expresión polaca inversa.

Descripción:

La división entera solo conserva la parte entera.
La expresión polaca inversa proporcionada es siempre válida. En otras palabras, la expresión siempre arroja un valor válido y no hay ningún caso en el que el divisor sea cero.

Ejemplo 1:

Entrada: tokens = ["2", "1", "+", "3", "*"]
Salida: 9
Explicación: Esta fórmula se convierte en una expresión aritmética infija común: ((2 + 1) * 3) = 9
Ejemplo 2:

Entrada: tokens = ["4", "13", "5", "/", "+"]
Salida: 6
Explicación: Esta fórmula se convierte en una expresión aritmética infija común: (4 + (13/5)) = 6
Ejemplo 3:

Entrada: tokens = ["10", "6", "9", "3", "+", "- 11", " ", "/", " ", "17", "+", "5 "," + "]
Resultado: 22
Explicación:
Esta fórmula se convierte en una expresión aritmética infija común:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

inmediato:

1 <= tokens.length <= 104
tokens [i] es un operador ("+", "-", "*" o "/") o un número entero en el rango [-200, 200]

Expresión polaca inversa:

La expresión polaca inversa es una especie de expresión de sufijo. El llamado sufijo significa que el operador está escrito detrás.

La fórmula más utilizada es una expresión infija, como (1 + 2) * (3 + 4).
La expresión polaca inversa de esta fórmula se escribe como ((1 2 +) (3 4 +) *).
Las expresiones polacas inversas tienen principalmente las siguientes dos ventajas:

Después de quitar los paréntesis, la expresión es inequívoca. Incluso si la fórmula anterior se escribe como 1 2 + 3 4 + *, el resultado correcto se puede calcular de acuerdo con el orden.
Es adecuado para operaciones de operaciones de pila: cuando se encuentra un número, se inserta en la pila; cuando se encuentra un operador, los dos números en la parte superior de la pila se sacan para el cálculo y el resultado se inserta en la pila.

 public int evalRPN(String[] tokens) {
    
    
        Deque<Integer> stack = new LinkedList<Integer>();
        int num = tokens.length;
        for (int i=0; i<num; i++) {
    
    
            String token = tokens[i];
            if (isNumber(token)) {
    
    
                stack.push(Integer.parseInt(token)); // 字符串转int
            } else {
    
    
                int num2 = stack.pop();
                int num1 = stack.pop();
                switch (token) {
    
    
                    case "+" : stack.push(num1+num2); break;
                    case "-" : stack.push(num1-num2); break;
                    case "*" : stack.push(num1*num2); break;
                    case "/" : stack.push(num1/num2); break;
                    default:
                }
            }
        }
    return stack.pop();

    }

    // 判断 从栈中取出的是+-*/ 还是数字
    public boolean isNumber(String token) {
    
    
        return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_45567738/article/details/115025858
Recomendado
Clasificación