模拟题,有机会在做一遍,现在是CV看题解
import com.sun.javafx.collections.MappingChange;
import java.util.*;
/**
* @author xnl
* @Description:
* @date: 2022/7/6 22:05
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
String str = "(let x 2 (mult x (let x 3 y 4 (add x y))))";
System.out.println(solution.evaluate(str));
}
Map<String, Deque<Integer>> scope = new HashMap<>();
int start = 0;
public int evaluate(String expression) {
return innerEvaluate(expression);
}
private int innerEvaluate(String expression){
if (expression.charAt(start) != '('){
// 不等于括号的话,那就是可能是整数获取字母
if (Character.isLowerCase(expression.charAt(start))){
String var = parseVar(expression);
return scope.get(var).peek();
}
return parseInt(expression);
}
int res;
start++; // 移除左括号
if (expression.charAt(start) == 'l'){
start += 4;
List<String> vars = new ArrayList<>();
while (true){
if (!Character.isLowerCase(expression.charAt(start))){
res = innerEvaluate(expression);
break;
}
String var = parseVar(expression);
if (expression.charAt(start) == ')'){
res = scope.get(var).peek();
break;
}
vars.add(var);
start++; // 移除空格
int e = innerEvaluate(expression);
scope.putIfAbsent(var, new ArrayDeque<Integer>());
scope.get(var).push(e);
start++; // 移除空格
}
for (String var : vars) {
scope.get(var).pop(); // 清除当前作用域的变量
}
} else if (expression.charAt(start) == 'a'){
start += 4;
int e1 = innerEvaluate(expression);
start++;
int e2 = innerEvaluate(expression);
res = e2 + e1;
} else {
start += 5;
int e1 = innerEvaluate(expression);
start++;
int e2 = innerEvaluate(expression);
res = e1 * e2;
}
start++;
return res;
}
/**
* 解析整数
* @param expression
* @return
*/
private int parseInt(String expression){
int n = expression.length();
int res = 0, sign = 1;
if (expression.charAt(start) == '-'){
sign = -1;
start++;
}
while (start < n && Character.isDigit(expression.charAt(start))){
res = res * 10 + (expression.charAt(start) - '0');
start++;
}
return sign * res;
}
/**
* 解析变量
* @return
*/
private String parseVar(String expression){
int n = expression.length();
StringBuffer sb = new StringBuffer();
while (start < n && expression.charAt(start) != ' ' && expression.charAt(start) != ')'){
sb.append(expression.charAt(start));
start++;
}
return sb.toString();
}
}