题解 | #简单计算器#

简单计算器

https://www.nowcoder.com/practice/5759c29a28cb4361bc3605979d5a6130

#include <iostream>
#include <cstring>
#include <stack>
#include <map>
using namespace std;
map<char, int> level = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
double cpt(double a, double b, char c)
{
    if( c == '+') return a + b;
    else if( c == '-') return a - b;
    else if( c == '*') return a * b;
    return a / b;
}
void computer(string s)
{
    stack<double> num;
    stack<char> ops;
    for(int i = 0; i < s.size(); i ++)
    {
        char c = s[i];
        if(c == ' ') continue;
        if(c >='0' && c <= '9')
        {
            double t = 0;
            while(i < s.size() && s[i] >='0' && s[i] <= '9')
            {
                t = t * 10 + s[i] - '0';
                i ++;
            }
            i = i - 1;
            num.push(t);
            // cout << num.top() << " " << i << endl;
        }
        else if(ops.empty() || level[c] > level[ops.top()]) ops.push(c);
        else
        {
            while(ops.size() && level[c] <= level[ops.top()])
            {
                double b = num.top(); num.pop();
                double a = num.top(); num.pop();
                char op = ops.top(); ops.pop();
                num.push(cpt(a, b, op));
                // cout << num.top() << " " << endl;
            }
            ops.push(c);
        }
    }
    while(ops.size())
    {
        double b = num.top(); num.pop();
        double a = num.top(); num.pop();
        char op = ops.top(); ops.pop();
        num.push(cpt(a, b, op));
        // cout << num.top() << " " << endl;
    }
    double ret = num.top();
    printf("%.2lf\n", ret);
}
int main() {
    string s;
    while (getline(cin, s) && s != "0") { // 注意 while 处理多个 case
        computer(s);
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务