Evaluate a formula
A spreadsheet cell holds a small arithmetic formula, and the recalculation pass turns it into a number.
- Non-negative whole numbers with + - * / between them. No brackets.
- Multiplication and division bind tighter than addition and subtraction.
- Division truncates towards zero: 7/2 is 3.
- Whitespace anywhere is ignored.
- A division by zero makes the whole formula 0.
evaluateExpression(text: string) → int
C++ needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.
Where you start
int evaluateExpression(std::string text) {
}
Worked examples
| Call | Result |
|---|---|
evaluateExpression(std::string("2+3*4")) | 14 |
evaluateExpression(std::string("10-2-3")) | 5 |
evaluateExpression(std::string("7/2")) | 3 |
evaluateExpression(std::string("2*3+4*5")) | 26 |
Hint
Carry a running total plus one pending term. On + or - you bank the pending term; on * or / you fold the new number into it.
Reference solution in C++
int evaluateExpression(std::string text) {
string clean;
for (char c : text) if (!isspace(static_cast<unsigned char>(c))) clean += c;
int total = 0, term = 0, num = 0;
char op = '+';
for (size_t i = 0; i <= clean.size(); i++) {
char c = i < clean.size() ? clean[i] : '#';
if (c >= '0' && c <= '9') { num = num * 10 + (c - '0'); continue; }
if (op == '+') { total += term; term = num; }
else if (op == '-') { total += term; term = -num; }
else if (op == '*') term = term * num;
else { if (num == 0) return 0; term = term / num; }
op = c;
num = 0;
}
return total + term;
}