C语言系列12——简单计算器

在这里插入图片描述
在这里插入图片描述
图片来源于王道机试课程

#include <stack>
#include <string>
#include <map>
#include <cstdio>
using namespace std;

int main() {
    char buf[300];
    map<char,int> priority = {
            {'$',0},
            {'+',1},{'-',1},
            {'*',2},{'/',2}
    };
    while(fgets(buf,300,stdin) != NULL){
        string expr = buf;
        expr.pop_back();

        if (expr == "0"){
            break;
        }
        expr.push_back('$');//补充一个虚拟的终止符

        string num; //用来搜集单独的0-9以组成一个数字 1 2 3 4 --> 1234
        stack<double> numstack;
        stack<char> operstack;
        for (int i = 0; i < expr.size(); ++i) {
            if (expr[i] >= '0' && expr[i] <= '9'){
                num.push_back(expr[i]);
            } else if (expr[i] == ' '){
                if (num != ""){
                    numstack.push(stod(num));//stod --> string to double
                    num = "";
                }
            } else{
                // + - * / $
                if (expr[i] == '$'){
                    if (num != ""){
                        numstack.push(stod(num));
                        num = "";
                    }
                }

                while (!operstack.empty()&&priority[operstack.top()] >= priority[expr[i]]){
                    // 新来的运算符的优先级不高于栈顶的优先级
                    char oper = operstack.top();
                    operstack.pop();
                    double rhs = numstack.top();
                    numstack.pop();
                    double lhs = numstack.top();
                    numstack.pop();

                    switch (oper) {
                        case '+':
                            numstack.push(lhs + rhs);
                            break;
                        case '-':
                            numstack.push(lhs - rhs);
                            break;
                        case '*':
                            numstack.push(lhs * rhs);
                            break;
                        case '/':
                            numstack.push(lhs / rhs);
                            break;
                    }
                }
                // 所有比expr[i]优先级更高的运算符都计算过了
                operstack.push(expr[i]);
            }
        }
        printf("%.2lf\n",numstack.top());
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值