表达式相关的题目,由于会出现各种嵌套,通常用递归来做。
递归来做主要由两种,如 op e1 e2
1. 通过括号或者空格找到 e1, e2 的范围,递归求解 e1, e2。
2. 直接递归求解,在递归内找 e 的范围。
由于本题比较复杂,很难直接把嵌套的表达式找出来,因此采用第二种方法,在递归中处理嵌套表达式,同时处理括号等边界情况。而且由于scope的存在,本题需要一个栈来记录 variable 的值,进入递归的时候压栈,退出的时候出栈。
let非常繁琐,ei 和 expr 都可以是表达式,需要递归求解,而 vi 一定只是个字符串,用 getToken 得到即可。
class Solution {public: deque> scopes; int evaluate(string expression) { int pos=0; return eval(expression, pos); } int eval(const string &s, int &pos){ scopes.push_front(unordered_map ()); int value=0; //return val of current expr if (s[pos]=='(') ++pos; string token=getToken(s,pos); //cout << token << endl; if (token=="add"){ // expecting " e1 e2)" int e1=eval(s,++pos); //skip ' ' int e2=eval(s,++pos); value = e1 + e2; }else if (token=="mult"){ int e1=eval(s,++pos); //skip ' ' int e2=eval(s,++pos); value = e1 * e2; }else if (token=="let"){ // expecting " let v1 e1 v2 e2 ... vn en expr) ...." while (pos