Created
June 24, 2018 02:28
-
-
Save pykello/272e51e79c960bf70bf3f5df7fa5d1bd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* solution 1 */ | |
class Solution { | |
public: | |
int calculateNum(string &s, int &c) { | |
int result = 0; | |
while (c < s.length() && s[c] != '+' && s[c] != '-' && s[c] != '*' && s[c] != '/') { | |
if (s[c] >= '0' && s[c] <= '9') { | |
result = result * 10 + s[c] - '0'; | |
} | |
c++; | |
} | |
return result; | |
} | |
int calculateMult(string &s, int &c) { | |
int result = 1; | |
bool div = false; | |
while (c < s.length()) { | |
if (div) { | |
result = result / calculateNum(s, c); | |
} else { | |
result = result * calculateNum(s, c); | |
} | |
div = s[c] == '/'; | |
if (s[c] == '+' || s[c] == '-') | |
break; | |
c++; | |
} | |
return result; | |
} | |
int calculateSums(string &s, int &c) { | |
int result = 0; | |
int sign = 1; | |
while (c < s.length()) { | |
result += sign * calculateMult(s, c); | |
sign = s[c++] == '+' ? 1 : -1; | |
} | |
return result; | |
} | |
int calculate(string s) { | |
int current = 0; | |
return calculateSums(s, current); | |
} | |
}; | |
/* solution 2 */ | |
class Expr { | |
public: | |
virtual int eval() = 0; | |
}; | |
class BinaryExpr: public Expr { | |
public: | |
BinaryExpr(Expr *l, Expr *r, char o) { | |
left = l; | |
right = r; | |
op = o; | |
} | |
int eval() { | |
if (op == '+') | |
return left->eval() + right->eval(); | |
else if (op == '-') | |
return left->eval() - right->eval(); | |
else if (op == '*') | |
return left->eval() * right->eval(); | |
else | |
return left->eval() / right->eval(); | |
} | |
Expr *left; | |
Expr *right; | |
char op; | |
}; | |
class IntValueExpr: public Expr { | |
public: | |
IntValueExpr(int v) { | |
value = v; | |
} | |
int eval() { | |
return value; | |
} | |
int value; | |
}; | |
class Solution { | |
public: | |
Expr* parseNum(string &s, int &c) { | |
int value = 0; | |
while (c < s.length() && s[c] != '+' && s[c] != '-' && s[c] != '*' && s[c] != '/') { | |
if (s[c] >= '0' && s[c] <= '9') { | |
value = value * 10 + s[c] - '0'; | |
} | |
c++; | |
} | |
return new IntValueExpr(value); | |
} | |
Expr* parseLeftAssocMult(string &s, int &c) { | |
Expr* result = parseNum(s, c); | |
while (s[c] == '*' || s[c] == '/') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseNum(s, c), op); | |
} | |
return result; | |
} | |
Expr* parseLeftAssocSum(string &s, int &c) { | |
Expr* result = parseLeftAssocMult(s, c); | |
while (s[c] == '+' || s[c] == '-') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseLeftAssocMult(s, c), op); | |
} | |
return result; | |
} | |
int calculate(string s) { | |
int current = 0; | |
return parseLeftAssocSum(s, current)->eval(); | |
} | |
}; | |
/* solution 3 */ | |
class Expr { | |
public: | |
virtual int eval() = 0; | |
}; | |
class BinaryExpr: public Expr { | |
public: | |
BinaryExpr(Expr *l, Expr *r, char o) { | |
left = l; | |
right = r; | |
op = o; | |
} | |
int eval() { | |
if (op == '+') | |
return left->eval() + right->eval(); | |
else if (op == '-') | |
return left->eval() - right->eval(); | |
else if (op == '*') | |
return left->eval() * right->eval(); | |
else | |
return left->eval() / right->eval(); | |
} | |
Expr *left; | |
Expr *right; | |
char op; | |
}; | |
class IntValueExpr: public Expr { | |
public: | |
IntValueExpr(int v) { | |
value = v; | |
} | |
int eval() { | |
return value; | |
} | |
int value; | |
}; | |
class Solution { | |
public: | |
Expr* parseNum(string &s, int &c) { | |
int value = 0; | |
while (isdigit(s[c])) { | |
value = value * 10 + s[c] - '0'; | |
c++; | |
} | |
return new IntValueExpr(value); | |
} | |
Expr* parseLeftAssocMult(string &s, int &c) { | |
Expr* result = parseNum(s, c); | |
while (s[c] == '*' || s[c] == '/') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseNum(s, c), op); | |
} | |
return result; | |
} | |
Expr* parseLeftAssocSum(string &s, int &c) { | |
Expr* result = parseLeftAssocMult(s, c); | |
while (s[c] == '+' || s[c] == '-') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseLeftAssocMult(s, c), op); | |
} | |
return result; | |
} | |
string removeWhitespace(string s) { | |
string result; | |
for (int i = 0; i < s.length(); i++) { | |
if (!isspace(s[i])) | |
result += s[i]; | |
} | |
return result; | |
} | |
int calculate(string s) { | |
int current = 0; | |
s = removeWhitespace(s); | |
return parseLeftAssocSum(s, current)->eval(); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Expr { | |
public: | |
virtual int eval() = 0; | |
}; | |
class BinaryExpr: public Expr { | |
public: | |
BinaryExpr(Expr *l, Expr *r, char o) { | |
left = l; | |
right = r; | |
op = o; | |
} | |
int eval() { | |
if (op == '+') | |
return left->eval() + right->eval(); | |
else if (op == '-') | |
return left->eval() - right->eval(); | |
else if (op == '*') | |
return left->eval() * right->eval(); | |
else | |
return left->eval() / right->eval(); | |
} | |
Expr *left; | |
Expr *right; | |
char op; | |
}; | |
class IntValueExpr: public Expr { | |
public: | |
IntValueExpr(int v) { | |
value = v; | |
} | |
int eval() { | |
return value; | |
} | |
int value; | |
}; | |
class Solution { | |
public: | |
Expr* parseNum(string &s, int &c) { | |
if (s[c] == '(') { | |
c++; | |
Expr* result = parseLeftAssocSum(s, c); | |
c++; | |
return result; | |
} | |
int value = 0; | |
while (isdigit(s[c])) { | |
value = value * 10 + s[c] - '0'; | |
c++; | |
} | |
return new IntValueExpr(value); | |
} | |
Expr* parseLeftAssocMult(string &s, int &c) { | |
Expr* result = parseNum(s, c); | |
while (s[c] == '*' || s[c] == '/') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseNum(s, c), op); | |
} | |
return result; | |
} | |
Expr* parseLeftAssocSum(string &s, int &c) { | |
Expr* result = parseLeftAssocMult(s, c); | |
while (s[c] == '+' || s[c] == '-') { | |
char op = s[c]; | |
c++; | |
result = new BinaryExpr(result, parseLeftAssocMult(s, c), op); | |
} | |
return result; | |
} | |
string removeWhitespace(string s) { | |
string result; | |
for (int i = 0; i < s.length(); i++) { | |
if (!isspace(s[i])) | |
result += s[i]; | |
} | |
return result; | |
} | |
int calculate(string s) { | |
int current = 0; | |
s = removeWhitespace(s); | |
return parseLeftAssocSum(s, current)->eval(); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment