计算器问题
 
 
解析字符串实现计算器功能
 
227. 基本计算器 II
 
 
 
- 加减存储结果、乘除立即运算
 - 在开头增加运算符+,实现「运算符、数字」的对子形式
 - 「+ 2 + 3 * 4 - 5 / 6 + 3」,初始化左、右为 0 
  
- 加、减则将右值加到左值上,并更新右值
 -  
     
 -  
     
 - 乘除则立即对右值进行运算,并更新右值
 -  
     
 -  
     
 -  
     
 
  - 最后返回 left + right
 
 
class Solution {
public:
    int calculate(string s) {
        int i = 0;
        return parseExptr(s, i);
    }
    int parseExptr(string& s, int& i) {
        char op = '+';
        int num = 0;
        int left = 0, right = 0;
        while(i < s.size()) {
        	char c = s[i];
            if (isdigit(c)) {
                num = num * 10 + (c- '0');
            }
            
            
            
            
            if ((!isdigit(c) && c != ' ') || i == s.size() - 1) {
                switch(op) {
                    case '+' : left += right; right = num; break;
                    case '-' : left += right; right = -num; break;
                    case '*' : right *= num; break;
                    case '/' : right /= num; break;
                    default: break;
                }
                op = c;
                num = 0;
            }
            i++; 
        }
        return left + right;
    }
};
 
 
224. 基本计算器
 
772. 基本计算器 III
 
 
- 遇 ‘(’ 则递归、遇 ‘)’ 则返回
 - 「2*(5+5*2)+(6/2+8) + 5」》 「2 * cal(5 + 5 * 2) + cal(6 / 2 + 8) + 5」
 - 遇到当前数字的下一个运算符时,才会计算当前数字的结果,因此:
 - 遇到右括号需要进行计算,否则如 5 * 2 的结果将会被抛弃
 - 遇到字符串结束需要计算,否则如 + 5 的结果将会被抛弃
 
 
class Solution {
public:
	
    set<char> se = {'+', '-', '*', '/',')'};
    int calculate(string s) {
        int i = 0;
        return parseExptr(s, i);
    }
    int parseExptr(string& s, int& i) {
        char op = '+';
        int num = 0;
        int left = 0, right = 0;
        while(i < s.size()) {
            char c = s[i];
            if (isdigit(c)) {
                num = num * 10 + (c- '0');
            }
            
            if (c == '(') {
            	
                i++;
                num = parseExptr(s, i);
                
                
                
            }
            
            if (se.count(c) || i == s.size() - 1) {
                switch(op) {
                    case '+' : left += right; right = num; break;
                    case '-' : left += right; right = -num; break;
                    case '*' : right *= num; break;
                    case '/' : right /= num; break;
                    default: break;
                }
                
                op = c;
                num = 0;
            }
            if (c == ')') break; 
            i++;
        }
        return left + right;
    }
};