表达式运算实现:
1.栈实现
public class ExpressCalc {
public static void main(String[] args) {
String[] expressArray = {
"2+3*(1+2*4)-3*5",
"2+3",
"2+3+(3*4/2)-1",
"2+3+(3*4/2+5)-1",
"2+3+(3*4/2+5-9)-1",
"2+3+(3*4/2+5-9)-1+2*(1+2)",
"2",
};
for (String expressStr : expressArray) {
int num = calcExpress(expressStr);
System.out.println(expressStr + "=" + num);
}
}
private static int calcExpress(String expressStr) {
Stack<Integer> numSt = new Stack<>();
Stack<Character> symbolSt = new Stack<>();
char[] cs = expressStr.toCharArray();
for (int i = 0; i < cs.length; i++) {
if(String.valueOf(cs[i]).matches("\\d")){
numSt.add(cs[i] - '0');
}else if(cs[i] == '+' || cs[i] == '-' || cs[i] == '*' || cs[i] == '/' || cs[i] == '(' || cs[i] == ')'){
if(symbolSt.isEmpty() || priority(cs[i], symbolSt.peek())){
symbolSt.add(cs[i]);
}else{
while(!symbolSt.isEmpty() && symbolSt.peek() != '(' && !priority(cs[i], symbolSt.peek())){
Integer n1 = numSt.pop();
Integer n2 = numSt.pop();
int res = calc(n2, n1, symbolSt.pop());
numSt.add(res);
}
if(!symbolSt.isEmpty() && symbolSt.peek() == '(') symbolSt.pop();
if(cs[i] != ')') symbolSt.add(cs[i]);
}
}
}
while(!symbolSt.isEmpty()){
Integer n1 = numSt.pop();
Integer n2 = numSt.pop();
int res = calc(n2, n1, symbolSt.pop());
numSt.add(res);
}
return numSt.pop();
}
public static boolean priority(char a, char b){
if(a == '(') return true;
if((a == '*' || a == '/') && (b == '+' || b == '-' || b == ')')) return true;
if((a == '+' || a == '-') && b == ')') return true;
return false;
}
public static int calc(int a, int b, char express){
switch (express){
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
throw new RuntimeException("不支持" + express + "进行运算");
}
}
}
2.中缀表达式转后缀表达式计算
https://blog.csdn.net/Linging_24/article/details/104481492