题目
根据 逆波兰表示法,求表达式的值。 示例 1:
输入: [“2”, “1”, “+”, “3”, " * "] 输出: 9 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) *
3) = 9 示例 2:输入: [“4”, “13”, “5”, “/”, “+”] 输出: 6 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 /
5)) = 6 示例 3:输入: [“10”, “6”, “9”, “3”, “+”, “-11”, " * ", “/”, " * ", “17”, “+”,
“5”, “+”]输出: 22
思路
题外话:逆波兰表达式相当于是二叉树的后序遍历,可以将运算符当做中间节点,按照后序遍历方式画出一个二叉树
逆波兰表达式适合用栈操作运算:遇到数字入栈,遇到运算符则出栈,取栈顶两个数字进行计算,并将结果压入栈中
java代码如下:
class Solution {
public int evalRPN(String[] tokens) {//创建一个名为tokens的String类型数组
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) {//遇到符号取栈顶两个元素进行操作
stack.push(stack.pop() + stack.pop());
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());//画图即可理解,有一个先后顺序
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));//Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer
}
}
return stack.pop();
}
}