输入一个运算表达式,利用逆波兰式输出运算结果
package 逆波兰式;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.Stack;
import java.util.Scanner;
public class ReversePolish {
public ReversePolish() {
}
public double suffixCalculate(String arr){
double result = 0;
arr = infixTurnSuffix(arr);
int p = 0;
Stack<String> stack = new Stack<>();
for (int i = 0; i < arr.length(); i++) {
if (isNumber(arr.charAt(i))) {
while (arr.charAt(i) != ',') {
p = p * 10 + Character.getNumericValue(arr.charAt(i++));
}
stack.push(String.valueOf(p));
p = 0;
} else if (isOperator(arr.charAt(i))) {
String num1 = stack.pop();
String num2 = stack.pop();
String num = num2 + arr.charAt(i) + num1;
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object sum = engine.eval(num);
stack.push(sum.toString());
}catch (ScriptException e){
e.printStackTrace();
}
}
}
result = Double.parseDouble(stack.pop());
return result;
}
private String infixTurnSuffix(String arr) {
Stack<Character> stack = new Stack<>();
String arr1 = new String();
for (int i = 0; i < arr.length(); i++) {
if (arr.charAt(i) == '(') {
stack.push(arr.charAt(i));
} else if (isOperator(arr.charAt(i))) {
char cur = arr.charAt(i);
if (stack.empty()) {
stack.push(cur);
} else if (stack.peek() == '(' || compare(cur) >= compare(stack.peek())) {
stack.push(cur);
} else {
for (int j = 0; j <= stack.size(); j++) {
char ch = stack.pop();
arr1 += ch;
if (stack.isEmpty()) {
stack.push(cur);
break;
} else if (compare(cur) > compare(stack.peek())) {
stack.push(cur);
break;
}
}
}
} else if (arr.charAt(i) == ')') {
for (int j = 0; j <= stack.size(); j++) {
char cur = stack.pop();
if (cur == '(') {
break;
} else {
arr1 += cur;
}
}
} else {
arr1 += arr.charAt(i);
if (i == arr.length() - 1 || !isNumber(arr.charAt(i + 1))) {
arr1 += ',';
}
}
}
while (!stack.empty()) {
arr1 += stack.pop();
}
return arr1;
}
private boolean isNumber(char charAt) {
if (charAt >= 48 && charAt <= 57) {
return true;
}
return false;
}
private boolean isOperator(char charAt) {
if (charAt == '+' || charAt == '-' || charAt == '*' || charAt == '/')
return true;
return false;
}
private int compare(char charAt) {
if (charAt == '+' || charAt == '-') {
return 1;
} else if (charAt == '*' || charAt == '/') {
return 2;
} else {
return 3;
}
}
}
public class TestDemo {
public static void main(String[] args) {
ReversePolish polish = new ReversePolish();
Scanner scanner = new Scanner(System.in);
String arr = scanner.next();
double x = polish.suffixCalculate(arr);
System.out.println(x);
}
}