daily pastebin goal
22%
SHARE
TWEET

Untitled

a guest Mar 23rd, 2019 149 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class Solution {
  2. public:
  3.     int recursive_calculator (string& s, int& i, int& last_indx) {
  4.         long num = 0;
  5.         stack<int> num_stack;
  6.         char prev_sign = '+'; // default sign
  7.         int tmp_sum = 0;
  8.        
  9.         for (; i < s.size(); i++) {
  10.             if (s[i] == ' ' && i != last_indx) continue;
  11.            
  12.             if (isdigit(s[i]))  {
  13.                 num = num * 10 + (s[i] - '0');
  14.             } else if ( s[i] == '(' ) {
  15.                 i++;
  16.                 num = recursive_calculator(s, i, last_indx);
  17.             }
  18.                                
  19.             if ( s[i] == ')' ||  i == last_indx || !isdigit(s[i]) ) {
  20.                 long num_pushed = 0;
  21.                
  22.                 switch(prev_sign) {
  23.                     case '+':
  24.                         num_stack.push(num);
  25.                         break;
  26.                     case '-':
  27.                         num_stack.push(-num);
  28.                         break;
  29.                     case '/':
  30.                         num_pushed = ( num_stack.top() ) / num;
  31.                         num_stack.pop();
  32.                         num_stack.push(num_pushed);
  33.                         break;
  34.                     case '*':
  35.                         num_pushed = ( num_stack.top() ) * num;
  36.                         num_stack.pop();
  37.                         num_stack.push(num_pushed);
  38.                         break;
  39.                     default:
  40.                         break;
  41.                 }
  42.    
  43.                 num = 0;
  44.  
  45.                 if (s[i] == ')') {
  46.                     i++;
  47.                     break;
  48.                 }
  49.                
  50.                 // prev sign may get assigned ' ' or ')'  but the switch case will take care
  51.                 // all invalid prev sign will fall in the default;
  52.                 if (i < last_indx) prev_sign = s[i];
  53.             }
  54.         }
  55.        
  56.         while (!num_stack.empty()) {
  57.             tmp_sum += num_stack.top();
  58.             num_stack.pop();
  59.         }
  60.         return tmp_sum;
  61.     }
  62.    
  63.    
  64.    
  65.     int calculate(string s) {
  66.         int new_start_pos = 0;
  67.         int last_indx = s.size()-1;
  68.         return recursive_calculator(s, new_start_pos, last_indx);
  69.     }
  70. };
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top