leetcode Basic Calculator

题目连接

https://leetcode.com/problems/basic-calculator/  

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;
};
原文地址:https://www.cnblogs.com/GadyPu/p/5020712.html