package cn.loosing.demo;
import java.util.*;
public class Test20210323_1 {
// 运算符优先级map
private static final Map OPT_PRIORITY_MAP = new HashMap() {
private static final long serialVersionUID = 6968472606692771458L;
{
put('(', 0);
put('+', 2);
put('-', 2);
put('*', 3);
put('/', 3);
put(')', 7);
}
};
public static void main(String[] args) {
String expr = "7*(2+3)*((((2+1))))";
System.out.println(expr);
Stack symbolStack = new Stack<>(); // 符号
Stack optStack = new Stack<>(); // 运算
List rpnList = new ArrayList<>(); //rpnList
StringBuilder curNumBuilder = new StringBuilder(16); // 当前正在读取中的数值字符追加器
expr.replaceAll(" ", "").chars().forEach(cht -> {
char ch = (char) cht;
if (!OPT_PRIORITY_MAP.containsKey(ch)) {
curNumBuilder.append(ch);
return;
}
if (curNumBuilder.length() != 0) {
rpnList.add(curNumBuilder.toString());
curNumBuilder.delete(0, curNumBuilder.length());
}
if (ch == '(')
symbolStack.push(ch);
else if (ch == ')')
while ((ch = symbolStack.pop()) != '(') rpnList.add(String.valueOf(ch));
else if (symbolStack.isEmpty() || OPT_PRIORITY_MAP.get(ch) > OPT_PRIORITY_MAP.get(symbolStack.lastElement()))
symbolStack.push(ch);
else {
rpnList.add(String.valueOf(symbolStack.pop()));
symbolStack.push(ch);
}
});
if (curNumBuilder.length() != 0) rpnList.add(curNumBuilder.toString());
while (!symbolStack.isEmpty()) rpnList.add(String.valueOf(symbolStack.pop()));
System.out.println(rpnList);
rpnList.forEach(str -> {
if (!OPT_PRIORITY_MAP.containsKey(str.charAt(0))){
optStack.push(str);
return;
}
double d2 = Double.valueOf(optStack.pop());
double d1 = Double.valueOf(optStack.pop());
switch (str.charAt(0)) {
case '+':
optStack.push(String.valueOf(d1 + d2));
break;
case '-':
optStack.push(String.valueOf(d1 - d2));
break;
case '*':
optStack.push(String.valueOf(d1 * d2));
break;
case '/':
optStack.push(String.valueOf(d1 / d2));
}
});
System.out.println(optStack);
}
}