/**
* 求算术表达式的值
* <p>
* 思路:
* 一个数字队列, 一个符号队列
* 先往符号队列中添加正号, 表示开始累加
* 遍历完了字符串后, 给数字队列和符号队列填充值
* 遍历符号队列, 如果是加号, 就把当前数字 重新添加到数字队列末尾
* 如果是减号, 就把数字取反, 添加到队列末尾
* 如果是乘号, 那么就从数字队列首位各取一位相乘后放到数字队列末尾
* 如果是除号, 那么就从数字队列首位各取一位相除后放到数字队列尾部
*
* @param s 算术表达式字符串(只包含数字、‘+’、’-‘、‘*’和’/‘符号)
* @return
*/
public static int T1(String s) {
// 数字链表
LinkedList<Double> numbers = new LinkedList<>();
// 符号链表
LinkedList<Character> characters = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
int j = i;
char c = s.charAt(i);
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '÷') {
// 依次放入符号链表
characters.add(c);
} else if ((c <= '9' && c >= '0') || c == '.') {
i++;
for (; i < s.length(); i++) {
c = s.charAt(i);
if ((c <= '9' && c >= '0') || c == '.') {
} else {
break;
}
}
double num = Double.parseDouble(s.substring(j, i));
// 依次放入数字链表
numbers.add(num);
i--;
}
}
if (numbers.size() != characters.size()) {
characters.addFirst('+');
}
Character c;
while ((c = characters.pollFirst()) != null) {
// 如果是加或减,那么就把当前拿出来数字 加/减到数字列表末尾
// 如果是除或乘,那么就把列表末尾的数字和首位数字拿出来,进行乘/除
// 比如 6/2,被处理后,符号是 + / ,数字是6 2, '+'号使得6被放在了末尾,变成2 6, '/'号的时候,从末尾拿数字6当做被除数,
// 头部拿数字2当除数,那么就是6 ÷ 2 = 3
if (c == '+') {
numbers.add(numbers.pollFirst());
}
if (c == '-') {
numbers.add(-numbers.pollFirst());
}
if (c == '*') {
numbers.add(numbers.pollFirst() * numbers.pollLast());
}
if (c == '/' || c == '÷') {
numbers.add(numbers.pollLast() / numbers.pollFirst());
}
}
double result = 0;
Double d;
while ((d = numbers.pollFirst()) != null) {
result += d;
}
return result;
}
测试案例:
System.out.println(T1("-2-11+2*2*2-9"));
System.out.println(T1("+2-11+2*2*2-9"));
System.out.println(T1("*2-11+2*2*2-9"));
System.out.println(T1("2-1+2*2*2-91"));