Evalúe el valor de una expresión aritmética en notación polaca inversa. Los operadores válidos son +, -, *, /. Cada operando puede ser un número entero u otra expresión. Por ejemplo:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
1. Enfoque ingenuo
Este problema se puede resolver utilizando una pila. Podemos recorrer cada elemento de la matriz dada. Cuando sea un número, empújelo a la pila. Cuando sea un operador, saque dos números de la pila, haga el cálculo y retroceda el resultado.
El siguiente es el código. Sin embargo, este código contiene errores de compilación en leetcode. ¿Por qué?
public class Test { public static void main(String[] args) throws IOException { String[] tokens = new String[] { "2", "1", "+", "3", "*" }; System.out.println(evalRPN(tokens)); } public static int evalRPN(String[] tokens) { int returnValue = 0; String operators = "+-*/"; Stack<String> stack = new Stack<String>(); for (String t : tokens) { if (!operators.contains(t)) { //push to stack if it is a number stack.push(t); } else {//pop numbers from stack if it is an operator int a = Integer.valueOf(stack.pop()); int b = Integer.valueOf(stack.pop()); switch (t) { case "+": stack.push(String.valueOf(a + b)); break; case "-": stack.push(String.valueOf(b - a)); break; case "*": stack.push(String.valueOf(a * b)); break; case "/": stack.push(String.valueOf(b / a)); break; } } } returnValue = Integer.valueOf(stack.pop()); return returnValue; } } |
El problema es que la declaración de cadena de cambio solo está disponible en JDK 1.7. Leetcode aparentemente usa una versión JDK por debajo de 1.7.
2. Solución aceptada
Si desea utilizar la instrucción switch, puede convertir lo anterior utilizando el siguiente código que utiliza el índice de una cadena «+ – * /».
public class Solution { public int evalRPN(String[] tokens) { int returnValue = 0; String operators = "+-*/"; Stack<String> stack = new Stack<String>(); for(String t : tokens){ if(!operators.contains(t)){ stack.push(t); }else{ int a = Integer.valueOf(stack.pop()); int b = Integer.valueOf(stack.pop()); int index = operators.indexOf(t); switch(index){ case 0: stack.push(String.valueOf(a+b)); break; case 1: stack.push(String.valueOf(b-a)); break; case 2: stack.push(String.valueOf(a*b)); break; case 3: stack.push(String.valueOf(b/a)); break; } } } returnValue = Integer.valueOf(stack.pop()); return returnValue; } } |