import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class Main{
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> num = new Stack<>();
Stack<Character> op = new Stack<>();
String s = br.readLine();;
int len = s.length();
Map<Character, Integer> map = new HashMap<>();
map.put('+', 1);
map.put('-', 1);
map.put('*', 2);
map.put('/', 2);
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
int x = 0, j = i;
while (j < len && Character.isDigit(s.charAt(j))) {
x = x * 10 + s.charAt(j++) - '0';
}
num.push(x);
i = j - 1;
} else if (s.charAt(i) == '(') {
op.push(s.charAt(i));
} else if (s.charAt(i) == ')') {
while (op.peek() != '(') eval(num, op);
op.pop();
} else if (op.isEmpty()){
op.push(s.charAt(i));
}else {
while (!op.isEmpty() && op.peek() != '(' && map.get(op.peek()) >= map.get(s.charAt(i))) eval(num, op);
op.push(s.charAt(i));
}
}
while (op.size() > 0) eval(num, op);
System.out.print(num.peek());
}
private static void eval(Stack<Integer> num, Stack<Character> op){
int num1 = num.pop();
int num2 = num.pop();
char x = op.pop();
if (x == '*') num.push(num2 * num1);
else if (x == '/') num.push(num2 / num1);
else if (x == '+') num.push(num2 + num1);
else if (x == '-') num.push(num2 - num1);
}
}
AcWing 3302. 表达式求值
最新推荐文章于 2024-11-06 20:20:40 发布