Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are
+
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
bool isNumber(string a){ if(a.empty()) return false; int i = 0; if(a.length() == 1){ return a[0] >= '0' && a[0] <= '9'; } if(a[0] == '-'|| a[0] == '+') ++i; for(; i<a.length(); ++i){ if(a[i]<'0' || a[i] >'9') return false; } return true; } int str2num(string a){ if(a.empty()) return 0; int ret = 0; bool neg = false; int i = 0; if(a[0] == '-') { neg = true; ++i; } else if(a[0] == '+') { neg = false; ++i; } for(; i < a.length(); ++i){ ret = ret*10+(a[i]-'0'); } if(neg) return -ret; return ret; } int evalRPN(vector<string> &tokens) { if(tokens.empty()) return 0; stack<string> s1; stack<int> s2; for(int i = tokens.size() - 1; i >= 0; --i) s1.push(tokens[i]); while(!s1.empty()){ string cur = s1.top(); s1.pop(); if(isNumber(cur)){ int curnum = str2num(cur); s2.push(curnum); } else{ int b = s2.top(); s2.pop(); int a = s2.top(); s2.pop(); int res; switch(cur[0]){ case('+'): res = a+b; break; case('-'): res = a-b; break; case('*'): res = a*b; break; case('/'): res = a/b; break; default: break; } s2.push(res); } } return s2.top(); }
No comments:
Post a Comment