Skip to content

Instantly share code, notes, and snippets.

@pykello
Created June 24, 2018 02:28
Show Gist options
  • Save pykello/272e51e79c960bf70bf3f5df7fa5d1bd to your computer and use it in GitHub Desktop.
Save pykello/272e51e79c960bf70bf3f5df7fa5d1bd to your computer and use it in GitHub Desktop.
/* 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();
}
};
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