题目
公式字符串求值
java代码
package com.lizhouwei.chapter5;
import java.util.Deque;
import java.util.LinkedList;
/**
* @Description: 公式字符串求值
* @Author: lizhouwei
* @CreateDate: 2018/4/25 20:42
* @Modify by:
* @ModifyDate:
*/
public class Chapter5_15 {
public int getValue(String str) {
char[] chars = str.toCharArray();
int[] res = value(chars, 0);
return res[0];
}
public int[] value(char[] chars, int i) {
int[] res = null;
int num = 0;
Deque<String> deque = new LinkedList<>();
for (; i < chars.length && chars[i] != ')'; i++) {
if (chars[i] >= '0' && chars[i] <= '9') {
num = num * 10 + chars[i] - '0';
} else if (chars[i] == '(') {
res = value(chars, i + 1);
num = res[0];
i = res[1];
} else {
addNum(deque, num);
deque.offerLast(String.valueOf(chars[i]));
num = 0;
}
}
addNum(deque, num);
return new int[]{getNum(deque), i};
}
public void addNum(Deque<String> deque, int num) {
int pre = 0;
if (!deque.isEmpty()) {
String last = deque.pollLast();
if (last.equals("+") || last.equals("-")) {
deque.offerLast(last);
} else {
pre = Integer.valueOf(deque.pollLast());
num = last.equals("*") ? pre * num : pre / num;
}
}
deque.offerLast(String.valueOf(num));
}
public int getNum(Deque<String> deque) {
int res = 0;
int curNum = 0;
boolean preSign = true;
String fist = null;
while (!deque.isEmpty()) {
fist = deque.pollFirst();
if (fist.equals("+") || fist.equals("-")) {
preSign = fist.equals("+");
} else {
curNum = Integer.valueOf(fist);
res = preSign ? res + curNum : res - curNum;
}
}
return res;
}
//测试
public static void main(String[] args) {
Chapter5_15 chapter = new Chapter5_15();
String str = "48*((70-65)-43)+8*1";
int result = chapter.getValue(str);
System.out.println("48*((70-65)-43)+8*1 结果:" + result);
}
}
结果
![](https://images2018.cnblogs.com/blog/1369004/201804/1369004-20180425220802170-1523381832.png)