leetcode Basic Calculator

来源:互联网 发布:淘宝联盟手机app 编辑:程序博客网 时间:2024/06/08 11:58

原题链接:https://leetcode.com/problems/basic-calculator/

Description

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:
“1 + 1 = 2”
“2-1 + 2 ” = 3
“(1+(4+5+2)-3)+(6+8)” = 23
Note: Do not use the eval built-in library function.
表达式计算。。

class ExpCalc {private:    string ret;    stack<char> op;    stack<int> num;    inline void erase() {        ret = "";        while (!op.empty()) op.pop();        while (!num.empty()) num.pop();    }    inline int calc(int d1, int d2, char ch) {        int val = 0;        switch (ch) {            case '+': val = d1 + d2;                break;            case '-': val = d2 - d1;                break;        }        return val;    }public:    ExpCalc() { erase(); }    ~ExpCalc() { erase(); }    inline void InfixToPostfix(const string src) {        int n = src.length();        for (int i = 0; i < n;) {            if (' ' == src[i] || '=' == src[i]) { i++; continue; }            if ('(' == src[i]) op.push(src[i++]);            if (')' == src[i]) {                while (op.top() != '(') {                    ret += op.top(); ret += ' ';                    op.pop();                }                op.pop(); i++;            } else if ('-' == src[i] || '+' == src[i]) {                while (!op.empty() && ('-' == op.top() || '+' == op.top())) {                    ret += op.top(); ret += ' ';                    op.pop();                }                op.push(src[i++]);            } else {                while (isdigit(src[i])) {                    ret += src[i++];                }                ret += ' ';            }        }        while (!op.empty()) {            ret += op.top(); ret += ' ';            op.pop();        }        ret += '=';    }    inline int PostfixCalc() {        int n = ret.length();        for (int i = 0; i < n;) {            if (' ' == ret[i] || '=' == ret[i]) { i++; continue; }            if ('-' == ret[i] || '+' == ret[i]) {                int d1 = num.top(); num.pop();                int d2 = num.top(); num.pop();                num.push(calc(d1, d2, ret[i++]));            } else if (isdigit(ret[i])) {                int x = 0;                while (isdigit(ret[i])) {                    x = x * 10 + ret[i++] - '0';                }                num.push(x);            }        }        return num.top();    }};class Solution {public:    int calculate(string s) {        if (s.empty()) return 0;        calc = new ExpCalc;        calc->InfixToPostfix(s);        int ans = calc->PostfixCalc();        return ans;    }private:    ExpCalc *calc;};
0 0