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));
}