No testdata at current.
用栈模拟这个过程即可。具体细节见代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Stack<String> stack = new Stack<>();
for (char x : s.toCharArray()) {
// 忽略空格
if (x == ' ') {
continue;
}
// 左括号实际也没用
if (x == '(') {
continue;
}
// 每次遇到右括号,栈的顶部一定形如: ... op val1 , val2 , ... valk
// 那么计算就是 valk op valk-1 op ... op val1
/*
举个实际的例子,比如遇到右括号时,
栈是: (前面一段blabla是什么不用管) - 1 3 2
那么就是进行: 2 - 3 - 1 , 得到 -2 , 然后再放入栈中
栈是: (前面一段blabla是什么不用管) * 2 3
那么就是进行: 3 * 2 , 得到 6,再放入栈中
*/
if (x == ')') {
String op = "";
List<Integer> val = new ArrayList<>();
while (!stack.empty() && !isOperator(stack.peek())) {
val.add(Integer.parseInt(stack.pop()));
}
op = stack.pop();
Collections.reverse(val);
stack.push(String.valueOf(calc(op, val)));
} else {
stack.push(String.valueOf(x));
}
}
System.out.println(stack.pop());
}
public static int calc(String op, List<Integer> val) {
int res = val.get(0);
for (int i = 1; i < val.size(); i++) {
if (op.equals("+")) {
res += val.get(i);
} else if (op.equals("-")) {
res -= val.get(i);
} else {
res *= val.get(i);
}
}
return res;
}
public static boolean isOperator(String op) {
return op.equals("+") || op.equals("-") || op.equals("*");
}
}
s表达式是一种用于表示数学表达式的文本格式,它采用前缀符号表示法,即操作符号位于其对应的操作数之前。表达式的两端使用括号包裹,参数可以有多个,以空格分隔。例如,表达式 (+ 1 2 3) 的执行结果为 1 + 2 + 3 = 6。表达式可以嵌套,嵌套的情况下总是先执行内层括号的表达式,再执行外层括号的表达式。常见的操作符包括加法(+)、减法(-)和乘法(*)。
现在,您需要编写一个程序,输入为一个字符串,表示一个s表达式。您的程序需要支持三种操作符:加法、减法和乘法,并能正确计算表达式的值。
输入1
(+ 1 2 3)
输出1
6
输入2
(- (* (+ 1 2) 2) 3 1)
输出2
2