描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
数据范围:表达式计算结果和过程中满足 |val| \le 1000 \∣val∣≤1000 ,字符串长度满足 1 \le n \le 1000 \1≤n≤1000
输入描述:
输入一个算术表达式
输出描述:
得到计算结果
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String arr = in.nextLine();
if(arr != null) {
arr = arr.replace("{", "(");
arr = arr.replace("}", ")");
arr = arr.replace("[", "(");
arr = arr.replace("]", ")");
System.out.println(calc(arr));
}
}
public static int calc(String arr) {
Stack<Integer> stack = new Stack<>();
char op = '+';
int num = 0;
for (int i = 0; i < arr.length(); ++i) {
char c = arr.charAt(i);
if (Character.isDigit(c)) {
num = num * 10 + (int)(c - '0');
} else if (c == '(') {
int count = 1;
int endPos = i+1;
while(endPos < arr.length()) {
if (arr.charAt(endPos) == ')') {
if (--count == 0) break;
} else if (arr.charAt(endPos) == '(') ++ count;
++endPos;
}
num = calc(arr.substring(i+1, endPos));
i = endPos;
} else {
switch(op) {
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop()*num);
break;
case '/':
stack.push(stack.pop()/num);
break;
}
num = 0;
op = c;
}
}
switch(op) {
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop()*num);
break;
case '/':
stack.push(stack.pop()/num);
break;
}
int sum = 0;
while(!stack.isEmpty()) {
sum += stack.pop();
}
return sum;
}
}
输入:
3+2*{1+2*[-4/(8-6)+7]}
输出:
25