问题 A: 简单计算器

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>


using namespace std;


int get_priority(char &op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
}

double cul(double &a, double &b, char &op) {
    switch (op) {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/' :
            return a / b;
    }
}

int main() {


    char s[1000];
    while (gets(s) ) {
        if (strlen(s)== 1 && s[0] == '0') break;

        stack<double> nums;
        stack<char> ops;

        int n = strlen(s);

        for (int i = 0; i < n; ++i) {
            if (s[i] == ' ') continue;
            else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
                //pop
                while (!ops.empty() && get_priority(ops.top()) >= get_priority(s[i])) {
                    char op = ops.top();
                    ops.pop();
                    double n1, n2;

                    n2 = nums.top();
                    nums.pop();
                    n1 = nums.top();
                    nums.pop();

                    double ans = cul(n1, n2, op);
                    nums.push(ans);
                }
                ops.push(s[i]);
            } else {
                double temp = 0;
                while (s[i]!= ' ' && i < n){
                    temp = temp * 10 +(s[i++]-'0');
                }
                nums.push(temp);
            }
        }

        while (!ops.empty()) {
            char op = ops.top();
            ops.pop();
            double n1, n2;

            n2 = nums.top();
            nums.pop();
            n1 = nums.top();
            nums.pop();
            double ans = cul(n1, n2, op);
            nums.push(ans);
        }

        printf("%.2lf\n", nums.top());


    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值