Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  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. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement