zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java反射机制
    jdbc连接mysql时发出警告:WARN: Establishing SSL connection without server's identity verification is not recommended...
    java,jdbc操作数据库
    vue.js 第十课-第十六课
    vue.js 第九课
    vue.js 第八课
    如何扒代码。。。
    vue.js第七课
    工作总结
    滤镜 filter:gray 变灰色
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4811253.html
Copyright © 2011-2022 走看看