文章目录
题目描述:
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
简单分析:
所谓逆波兰表达式,就是将标准的算数表达式进行变形,方法很简单,以括号为界,由内及外,在括号中,先运算符左边的数字取出,在取出右边数字,最后在取出运算符,以此类推。
简单思路
1.首先定义一个栈来存放数据,只要不是运算符号就存入。
2.当遇到运算符号时,分别取出两个值,先后依次作为右操作数和左操作数,再将其结果存入栈中用于之后运算。
这里需要注意栈的特点时先入后出。
如图:
如此循环,直到数组遍历完全,返回数组中最后一个值,即为最终结果。
代码如下:
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0;i < tokens.length;i++){
if(!isOperations(tokens [i])){
stack.push(Integer.parseInt(tokens [i]));
}else{
//这里实现左右操作数的正确传入。
int num2 = stack.pop();
int num1 = stack.pop();
switch(tokens [i]){
case "+":
stack.push(num1+num2);
break;
case "-":
stack.push(num1-num2);
break;
case "*":
stack.push(num1*num2);
break;
case "/":
stack.push(num1/num2);
break;
}
}
}
return stack.pop();
}
//自定义一个方法,用来判断传入的是否为运算符
private boolean isOperations(String s){
if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
return true;
}
return false;
}
}