题目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
分析:
用逆波兰表达式计算表达式的值,逆波兰表达式又叫做后缀表达式,它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。
其运算方式如下:如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。用栈来处理这种问题。
代码:
import java.util.*;
public class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> num = new Stack<>();
int n=0;
for(int i = 0;i<tokens.length;i++){
if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")||tokens[i].equals("/")){//根据栈中的数据为操作符进行出栈,加减乘除操作
int num1 = num.pop();
int num2 = num.pop();
if(tokens[i].equals("+")){
n = num1+num2;
}
if(tokens[i].equals("-")){
n = num2-num1;
}
if(tokens[i].equals("*")){
n = num2*num1;
}
if(tokens[i].equals("/")){
n = num2/num1;
}
num.push(n);
}else{//栈中的数据为非操作符,则入栈
int m = Integer.parseInt(tokens[i]);//将数组中的数据转换为int
num.push(m);
}
}
return num.pop();
}
}
知识点:
数据类型转换,Integer.parseInt(String)就是将String字符类型数据转换为Integer整型数据,Integer.parseInt("20")=20;
Interger.valueOf("123")=Integer(123)这时候Integer(123)就是整数123的对象表示形式,它再调用intValue()方法,就是将123的对象表示形式转化为基本数据123
Integer.valueof()返回的是包装类Integer的对象
Integer.parseInt() 返回的是一个int的值
Integer.valueof().intValue();返回的也是一个int的值