LeetCode 770. Basic Calculator IV题目解析

转载源:戳这里

题目解析

此题是LeetCode 772的加强版,我们依然使用递归下降法来解决这个问题,文法如下:

  1. exp := exp +|- additive | additive

  2. additive := additive * factor | additive

  3. factor := num | (exp) | variable(变量)

我们使用vector类型来表示表达式的结果,该容器中元素之间的关系是相加,比如vector res = ["a", "10"],表示表达式"a+10"。这样只需要在additive函数中处理相乘,在exp函数中处理合并同类项即可。

本地调试模板

class Solution {
public:
 
    string token;
    string str;
    int index;
 
    vector g_evalvars;
    vector g_evalints;
 
 
    //找出下一个符号 + - * ( ) 数字或者变量
    string get_token() {
        while(str[index]==' ') index++;  //去除空格
        string token = "";
        if(index == str.length()) return token;
        //数字
        if(str[index]>='0' && str[index]<='9') {
            while(str[index]>='0' && str[index]<='9') {
                token += str[index];
                index++;
            }
        }else if(str[index]>='a' && str[index]<='z') {  //变量
            while(str[index]>='a' && str[index]<='z') {
                token += str[index];
                index++;
            }
        }else
        switch(str[index]) {
            case '+':
                token += "+";
                index++;
                break;
            case '-':
                token += "-";
                index++;
                break;
            case '*':
                token += "*";
                index++;
                break;
            case '/':
                token += "/";
                index++;
                break;
            case '(':
                token += '(';
                index++;
                break;
            case ')':
                token += ')';
                index++;
                break;
            default:  //不可识别的记号
                break;
        }
        return token;
    }
    //判断是否为num
    bool is_num(string &tk) {
        for(int i=0; i='a' && tk[i]<='z') return false;
        return true;
    }
    string int2str(const int int_temp)
    {
        string string_temp;
        stringstream stream;
        stream<>string_temp
        return string_temp;
    }
    //使用c分割字符串s
    void split_string(const string& s, const string& c, vector &v){
        string::size_type pos1, pos2;
        pos2 = s.find(c);
        pos1 = 0;
        while(string::npos != pos2){
            v.push_back(s.substr(pos1, pos2-pos1));
 
            pos1 = pos2 + c.size();
            pos2 = s.find(c, pos1);
        }
        if(pos1 != s.length())
            v.push_back(s.substr(pos1));
    }
    //分离因子的系数和变量
    void split(const string &fac1, string &num1, string &vars1) {
        int i = 0;
        while(i vvars1, vvars2;
        split_string(vars1, "*", vvars1);
        split_string(vars2, "*", vvars2);
        sort(vvars1.begin(), vvars1.end());
        sort(vvars2.begin(), vvars2.end());
 
        res += int2str(coff);
        int s1 = 0, s2 = 0;
        while(s1 nums2; //度大的优先
        else {
            string vars1, vars2;
            int i = 0;
            while(i &res, vector &res1) {
        if(res.size() == 0) return ;
 
        sort(res.begin(), res.end(), cmp);
        int c;
        string num;
        string var;
        for(int i=0; i exp() {
        vector res = additive();
        vector temp;
        while(token=="+" || token=="-") {
            string op = token;
            token = get_token();    //跳过'+' '-'
            temp = additive();
            if(op=="+") {
                for(int i=0; i res1;
        //合并同类项
        merge_factor(res, res1);
        return res1;
    }
    vector additive() {
        vector res = factor();
        while(token=="*") {
            token = get_token();   //跳过'*'
            vector fac= factor();
            vector temp;
            //执行相乘运算
            for(int i=0; i factor() {
        vector res;
        if(token == "(") {
            token = get_token();
            res = exp();
            token = get_token();  //跳过')'
        }else {
            if(is_num(token)) {
                res.push_back(token);
            }else {
                for(int i=0; i basicCalculatorIV(string expression, vector& evalvars, vector& evalints) {
        vector res;
        str = expression;
        g_evalvars = evalvars;
        g_evalints = evalints;
        index = 0;
        token = get_token();
        res = exp();
        return res;
    }
};


你可能感兴趣的:(leetcode)