hdu 1237 简单计算器

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=1237 

简单计算器

Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

表达式计算,把前缀表达式变成后缀表达式再计算。。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<stack>
#include<set>
using std::cin;
using std::sort;
using std::pair;
using std::stack;
using std::string;
using std::getline;
#define pb(e) push_back(e)
#define sz(c) (int)(c).size()
#define mp(a, b) make_pair(a, b)
#define all(c) (c).begin(), (c).end()
#define iter(c) decltype((c).begin())
#define cls(arr, val) memset(arr, val, sizeof(arr))
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for(int i = 0; i < (int)n; i++)
#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
const int N = 5010;
const int INF = 0x3f3f3f3f;
typedef unsigned long long ull;
class ExpCalc {
private:
	string ret;
	stack<char> op;
	stack<double> num;
	inline void erase() {
		ret = "";
		while (!op.empty()) op.pop();
		while (!num.empty()) num.pop();
	}
	inline bool is_digit(char ch) {
		return ch >= '0' && ch <= '9';
	}
	inline bool get_op(char ch) {
		char buf[10] = "+-*/";
		for (int i = 0; i < 4; i++) {
			if (buf[i] == ch) return true;
		}
		return false;
	}
	inline int cmp(char ch) {
		switch (ch) {
			case '+':
			case '-': return 1;
			case '*':
			case '/': return 2;
		}
		return 0;
	}
	inline double calc(double d1, double d2, char ch) {
		double val = 0.0;
		switch (ch) {
			case '+': val = d1 + d2;
				break;
			case '-': val = d2 - d1;
				break;
			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 (get_op(src[i])) {
				while (!op.empty() && cmp(op.top()) >= cmp(src[i])) {
					ret += op.top(); ret += ' ';
					op.pop();
				}
				op.push(src[i++]);
			} else {
				while (is_digit(src[i]) || '.' == src[i]) {
					ret += src[i++];
				}
				ret += ' ';
			}
		}
		while (!op.empty()) {
			ret += op.top(); ret += ' ';
			op.pop();
		}
		ret += '=';
	}
	inline double PostfixCalc() {
		int n = ret.length();
		for (int i = 0; i < n;) {
			if (' ' == ret[i] || '=' == ret[i]) { i++; continue; }
			if (get_op(ret[i])) {
				double d1 = num.top(); num.pop();
				double d2 = num.top(); num.pop();
				num.push(calc(d1, d2, ret[i++]));
			} else if (is_digit(ret[i]) || '.' == ret[i]) {
				double x = 0.0;
				while (is_digit(ret[i])) {
					x = x * 10 + ret[i++] - '0';
				}
				if ('.' == ret[i]) {
					i++;
					double y = 0.0, k = 10.0;
					while (is_digit(ret[i])) {
						y += (ret[i++] - '0') / k;
						k *= 10;
					}
					x += y;
				}
				num.push(x);
			}
		}
		return num.top();
	}
};
int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w+", stdout);
#endif
	string src;
	while (getline(cin, src) && src != "0") {
		ExpCalc work;
		work.InfixToPostfix(src);
		printf("%.2lf
", work.PostfixCalc());
	}
	return 0;
}
原文地址:https://www.cnblogs.com/GadyPu/p/4811253.html