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:
代码:
import java.util.Scanner;
import java.util.Stack;
//["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
//["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
public class evaluateReversePolishNotation {
public static void main(String[] args){
//处理输入,记在一个字符串数组
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
String[] strArr=str.split(",");
//借助栈,保存每个运算符之前的数字
Stack<Integer> stack=new Stack<Integer>();
for(int i=0;i<strArr.length;i++){
//当前为运算符时,进行当前运算,并把运算结果压入栈
if(isOperator(strArr[i])){
int left;
int right;
if(!stack.isEmpty()){
right=stack.pop();
}else{
System.out.println("输入格式错误");
return;
}
if(!stack.isEmpty()){
left=stack.pop();
}else{
System.out.println("输入格式错误");
return;
}
stack.push(compu(left,right,strArr[i]));
}else if(isNumeric(strArr[i])){
//为数字时,将数字压入栈
stack.push(Integer.parseInt(strArr[i]));
}else{
System.out.println("含有非法字符");
return;
}
}
System.out.println(stack.pop());
if(!stack.isEmpty()){
System.out.println("输入格式错误");
}
}
private static boolean isNumeric(String str) {
// TODO Auto-generated method stub
if(str.charAt(0)=='-'||str.charAt(0)=='+'){
for(int i=1;i<str.length();i++){
if(!Character.isDigit(str.charAt(i))){
return false;
}
}
}else{
for(int i=0;i<str.length();i++){
if(!Character.isDigit(str.charAt(i))){
return false;
}
}
}
return true;
}
//对当前运算符进行计算
private static int compu(int left, int right, String str) {
// TODO Auto-generated method stub
if(str.equals("+")){
return left+right;
}else if(str.equals("-")){
return left-right;
}else if(str.equals("*")){
return left*right;
}else{
if(right==0){
System.out.println("除数为0");
return -1;
}
return left/right;
}
}
//判断是否是运算符
public static boolean isOperator(String str) {
// TODO Auto-generated method stub
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return true;
}
return false;
}
}