题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
class HelloWorld {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
// 优先级运算符
Map<Character, Integer> map = new HashMap<>();
map.put('+', 1);
map.put('-', 1);
map.put('/', 2);
map.put('*', 2);
// 预处理字符串
s = s.replace("(-", "(0-").replace("(+", "(0+").replace(" ", "");
if (s.charAt(0) == '-') s = '0' + s;
Stack<Character> op = new Stack<>();
Stack<Integer> nums = new Stack<>();
char[] chars = s.toCharArray();
// 3*5+8-0*3-6+0+0 3+(2*3)-6+(3*2)
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '(') {// 遇到左括号直接压入运算符栈
op.push(chars[i]);
} else if (chars[i] == ')') {// 遇到有括号 当运算符栈顶不是左括号时 计算 结束后弹出()->
while (!op.isEmpty() && op.peek() != '(') {
calc(nums, op);
}
op.pop();
} else {
// 数字
if (Character.isDigit(chars[i])) {// 遇到数字压入栈
int j = 0, k = i;
while (k < chars.length && Character.isDigit(chars[k])) { // 123+233+...
j = j * 10 + (chars[k] - '0');
k++;
}
i = k - 1;
nums.push(j);
} else {
//遇到运算符 当栈顶不是左括号时 && 满足优先级时 =>计算 结束后压入运算符
while (!op.isEmpty() && op.peek() != '('
&& (map.get(op.peek()) >= map.get(chars[i]))) {
calc(nums, op);
}
op.push(chars[i]);
}
}
}
while (!op.isEmpty()) {//当运算符栈不为空 计算
calc(nums, op);
}
System.out.println(nums.peek());
}
private static void calc(Stack<Integer> nums, Stack<Character> op) {
if (op.isEmpty()) {
return;
}
if (nums.isEmpty() || nums.size() < 2) {
return;
}
// 0-1+(0-1*5+2)
char pop = op.pop();
Integer pop2 = nums.pop();
Integer pop1 = nums.pop();
switch (pop) {
case '+':
nums.push(pop1 + pop2);
break;
case '-':
nums.push(pop1 - pop2);
break;
case '*':
nums.push(pop1 * pop2);
break;
case '/':
nums.push(pop1 / pop2);
break;
}
}
}