您的位置:首页 > 其它

leetcode Basic Calculator

2015-12-04 22:21 344 查看
原题链接: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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: