leetcode : Basic Calculator II

实现一个简单的计算器,在llvmwiki上看见的算法

class Solution {
public:
    Solution() {
        pri['+'] = 1;
        pri['-'] = 1;
        pri['*'] = 2;
        pri['/'] = 2;
        pri['#'] = 0;
    }
    int calculate(string s) {
        int index = 0;
        if (s.size() == 0) {
            return 0;
        }
        char lookahead = 0;
        int lhs = getNum(s, index);
        return parse(lookahead, s, index, lhs, '#');
    }

private:
    int parse(char& lookahead, const string& s, int& index, int lhs, char minOp) {
        lookahead = peekOp(s, index);
        while (lookahead != 0 && pri[lookahead] >= pri[minOp]) {
            char op = lookahead;
            getOp(s, index);
            int rhs = getNum(s, index);
            lookahead = peekOp(s, index);
            while (lookahead != 0 && pri[lookahead] > pri[op]) {
                rhs = parse(lookahead, s, index, rhs, lookahead);
            }
            lhs = compute(lhs, rhs, op);
        }
        return lhs;
    }
    map<char, int> pri;
    int getNum(const string& s, int& index) {
        while (index < s.size() && s[index] == ' ') {
            ++index;
        }
        if (index == s.size()) {
            return -1;
        }
        int ret = 0;
        while (index < s.size() && isdigit(s[index])) {
            ret *= 10;
            ret += s[index++] - '0';
        }
        return ret;
    }
    char getOp(const string&s, int& index) {
        while (index < s.size() && s[index] == ' ') {
            ++index;
        }
        if (index == s.size() || isdigit(s[index])) {
            return 0;
        }
        else {
            return s[index++];
        }
    }
    char peekOp(const string&s, int index) {
        return getOp(s, index);
    }
    int compute(int lhs, int rhs, char op) {
        switch (op) {
        case '+': return lhs + rhs;
        case '-': return lhs - rhs;
        case '*': return lhs * rhs;
        case '/': return lhs / rhs;
        default: return 0;
        }
    }
};

 

posted on 2016-07-28 21:58  远近闻名的学渣  阅读(147)  评论(0)    收藏  举报

导航