class Solution { public int evalRPN(String[] tokens) { Stack stack = new Stack<>(); // 创建一个整型栈用于存放操作数
for (int i = 0; i < tokens.length; i++) { switch (tokens[i]) { case "+": // 加法运算 int num1 = stack.pop(); int num2 = stack.pop(); stack.push(num2 + num1); // 将计算结果压入栈中 break; case "-": // 减法运算 num1 = stack.pop(); num2 = stack.pop(); stack.push(num2 - num1); break; case "*": // 乘法运算 num1 = stack.pop(); num2 = stack.pop(); stack.push(num2 * num1); break; case "/": // 除法运算 num1 = stack.pop(); num2 = stack.pop(); stack.push(num2 / num1); break; default: // 如果是数字,则将其转换为整数并压入栈中 stack.push(Integer.valueOf(tokens[i])); break; } } return stack.pop(); // 返回栈中最终的计算结果 }
}
// 对于表达式[“4”,“13”,“5”,“/”,“+”] 看到好多人不懂,这里给大家耐心解释一下哇
/**
表达式是[“4”,“13”,“5”,“/”,“+”],它表示的数学表达式是:4 + (13 / 5)。
现在让我们来逐步分析代码是如何处理这个表达式的:
开始时,numStack 栈是空的。
遍历表达式数组:
第一个元素是 “4”,它不是运算符,因此执行 default 分支,将整数 4 压入 numStack,此时栈内元素为 [4]。
下一个元素是 “13”,同样不是运算符,执行 default 分支,将整数 13 压入 numStack,此时栈内元素为 [4, 13]。
接下来是 “5”,同样执行 default 分支,将整数 5 压入 numStack,此时栈内元素为 [4, 13, 5]。
然后是 “/”,它是一个运算符,因此执行 case “/” 分支,从栈顶依次弹出两个操作数,即 5 和 13,计算 13 / 5 的结果得到 2,然后将结果 2 压入栈中,此时栈内元素为 [4, 2]。
最后是 “+”,同样是一个运算符,执行 case “+” 分支,从栈顶依次弹出两个操作数,即 2 和 4,计算 4 + 2 的结果得到 6,然后将结果 6 压入栈中,此时栈内元素为 [6]。
遍历完整个表达式数组后,栈中只剩下一个元素,即最终的结果。因此,numStack.pop() 返回的是计算结果 6。
*/