java实现计算表达式
列入计算:5+2*(6*(2+4))+7
思路:把数字和操作字符装入2个栈中,根据操作字符的优先级计算,最后数中留下计算结果。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3NmaNVzYE1EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxADOwQzMxMTM2IzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
上代码:
import java.util.Stack;
public class Calculation {
private Stack<Character> chars;
private Stack<Long> numbers;
public long cal(String biaodashi) {
biaodashi = biaodashi == null ? "" : "=".equals(biaodashi.charAt(biaodashi.length() - 1)) ? biaodashi : biaodashi + "=";//+ =
Stack<Character> kuohao = new Stack<>(); //校验 ()匹配
for (int i = 0; i < biaodashi.length(); i++) {
char c = biaodashi.charAt(i);
if (!(isNumber(c)
|| "+".equals(c + "")
|| "-".equals(c + "")
|| "*".equals(c + "")
|| "/".equals(c + "")
|| "=".equals(c + "")
|| "(".equals(c + "")
|| ")".equals(c + ""))) {
System.err.println("表达式错误");
return -1; //结束程序
}
if ("(".equals(c + "")) {
kuohao.push(new Character(c));
}
if (")".equals(c + "")) {
if (kuohao.empty() || !"(".equals(kuohao.pop() + "")) {
System.out.println("括号不匹配");
return -1;
}
}
}
if (!kuohao.isEmpty()) {
System.out.println("右括号少了");
return -1;
}
chars = new Stack<>(); //使用的时候创建
numbers = new Stack<>(); //优化内存
StringBuffer stringBuffer = new StringBuffer(); //缓存多位操作数
//计算
for (int i = 0; i < biaodashi.length(); i++) {
char c = biaodashi.charAt(i);
if (isNumber(c)) {
stringBuffer.append(c);
} else {
//加入数字
if (!"".equals(stringBuffer.toString())) {
numbers.push(Long.parseLong(stringBuffer.toString()));
stringBuffer = new StringBuffer();
}
//栈顶有符号 且c的优先级小于等于栈顶的优先级 一直计算
while (!chars.isEmpty() && xiaoyu(c)) {
Long after = numbers.pop();
Long before = numbers.pop();
char operation = chars.pop();
switch (operation) {
case '+':
numbers.push(before + after);
break;
case '-':
numbers.push(before - after);
break;
case '*':
numbers.push(before * after);
break;
case '/':
numbers.push(before / after);
break;
}
} //while 结束
//添加符号 如果为) 去除()
if (!"=".equals(c + "")) {
chars.push(new Character(c));
if (")".equals(c + "")) {
chars.pop();
chars.pop();
}
}
} //else 结束
}//for 结束
return numbers.pop(); //返回计算结果
}
private boolean xiaoyu(char c) {
if ("(".equals(chars.peek() + ""))
return false; //c 需要入符号栈
char peek = chars.peek();
switch (c) {
case '+':
case '=':
case '-':
case ')':
return true; //不入栈 去计算
case '*':
case '/': {
if (peek == '+' || peek == '-')
return false;
return true;
}
case '(':
return false;
}
return false;
}
public boolean isNumber(Character number) {
if (number <= 57 && number >= 48)
return true;
return false;
}
public static void main(String[] args) {
String num = "5+2*(6*(2+4))+7"; // 默认的算式
long cal = new Calculation().cal(num);
System.out.println(cal);
}
}
只要敢尝试去写去思考就一定离结果越近,希望你我共同进步!
参考地址
https://www.cnblogs.com/wuqianling/p/5671667.html