1.将scope 设为全局变量,这样就可以不用弄为参数。不仅方便还解决了内层怎么任意访问外层的问题;
2.对于递归解决问题。1.首先确定大框架。
2.在确定最小的部分是什么,然后怎么处理。
这里的大框架是:三个语法规则,对应的操作。递归写出;
最小的部分是:最内层的那个括号所包含的部分;
class Solution {
public:
vector<map<string,int>> scope;
int evaluate(string expression) {
map<string,int> mp;
scope.push_back(mp);
int ans=evaluate_inner(expression);
scope.erase(scope.end()-1);
return ans;
}
int evaluate_inner(string expression){
if(expression[0]!='('){
if((expression[0]<='9'&&expression[0]>='0')||expression[0]=='-'){
int n=stoi(expression);
return n;
}
for(int i=scope.size()-1;i>=0;i--){
if(scope[i].count(expression)) return scope[i][expression];
}
}
vector<string> tokens;
int n=expression.size(),m=expression[1]=='m'?6:5;
tokens=parse(expression.substr(m,n-m-1));
string s1=expression.substr(1,3);
if(s1=="add"){
return evaluate(tokens[0])+evaluate(tokens[1]);
}
else if(s1=="let"){
for(int j=1;j<tokens.size();j+=2){
string tp=tokens[j-1];
scope[scope.size()-1][tp]=evaluate(tokens[j]);
}
return evaluate(tokens[tokens.size()-1]);
}
else{
return evaluate(tokens[0])*evaluate(tokens[1]);
}
}
vector<string> parse(string expression){
vector<string> ans;
int ball=0;
string buf="";
for(auto x:split(expression)){
for(char c:x){
if(c=='(') ball++;
if(c==')') ball--;
}
if(buf.size()>0) buf+=" ";
buf+=x;
if(ball==0){
ans.push_back(buf);
buf="";
}
}
return ans;
}
vector<string> split(string expression){
vector<string> ans;
int n=expression.size();
int prev=0;
int i;
for(i=0;i<n;i++){
if(expression[i]==' '){
ans.push_back(expression.substr(prev,i-prev));
prev=i+1;
}
}
ans.push_back(expression.substr(prev,i-prev));
return ans;
}
};