Advertisement
jasonpogi1669

Evaluate Math Expression from Strings in C++

Aug 3rd, 2022
834
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // from this site: https://www.geeksforgeeks.org/expression-evaluation/
  5.  
  6. int precedence(char op) {
  7.     if (op == '+' || op == '-') {
  8.         return 1;
  9.     }
  10.     if (op == '*' || op == '/') {
  11.         return 2;
  12.     }
  13.     return 0;
  14. }
  15.  
  16. double apply_op(double a, double b, char op) {
  17.     switch (op) {
  18.         case '+': {
  19.             return a + b;
  20.             break;
  21.         }
  22.         case '-': {
  23.             return a - b;
  24.             break;
  25.         }
  26.         case '*': {
  27.             return a * b;
  28.             break;
  29.         }
  30.         case '/': {
  31.             return a / b;
  32.             break;
  33.         }
  34.     }
  35. }
  36.  
  37. int evaluate(string tokens) {
  38.     stack<double> values;
  39.     stack<char> ops;
  40.     for (int i = 0; i < (int) tokens.size(); i++) {
  41.         if (tokens[i] == ' ') {
  42.             continue;
  43.         } else if (tokens[i] == '(') {
  44.             ops.push(tokens[i]);
  45.         } else if (isdigit(tokens[i])) {
  46.             double val = 0;
  47.             while (i < (int) tokens.size() && isdigit(tokens[i])) {
  48.                 val = (val * 10) + (tokens[i] - '0');
  49.                 i++;
  50.             }
  51.             values.push(val);
  52.             i--;
  53.         } else if (tokens[i] == ')') {
  54.             while (!ops.empty() && ops.top() != '(') {
  55.                 double val2 = values.top();
  56.                 values.pop();
  57.                 double val1 = values.top();
  58.                 values.pop();
  59.                 char op = ops.top();
  60.                 ops.pop();
  61.                 values.push(apply_op(val1, val2, op));
  62.             }
  63.             if (!ops.empty()) {
  64.                 ops.pop();
  65.             }
  66.         } else {
  67.             while (!ops.empty() && precedence(ops.top()) >= precedence(tokens[i])) {
  68.                 double val2 = values.top();
  69.                 values.pop();
  70.                 double val1 = values.top();
  71.                 values.pop();
  72.                 char op = ops.top();
  73.                 ops.pop();
  74.                 values.push(apply_op(val1, val2, op));
  75.             }
  76.             ops.push(tokens[i]);
  77.         }
  78.     }
  79.     while (!ops.empty()) {
  80.         double val2 = values.top();
  81.         values.pop();
  82.         double val1 = values.top();
  83.         values.pop();
  84.         char op = ops.top();
  85.         ops.pop();
  86.         values.push(apply_op(val1, val2, op));
  87.     }
  88.     return values.top();
  89. }
  90.  
  91. int main() {
  92.     cout << evaluate("((9+(5-3)*4)/2)*8") << "\n";
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement