题解 | #简单计算器#

简单计算器

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

#include <iostream>
#include <algorithm>
#include <stack>
#include <string>
#include <cstdio>
#include <map>

using namespace std;

//KY129
int main() {
    char buf[400];
    //用map来存储运算符的优先级
    map<char, int> priority = {
        {'$', 0},
        {'+', 1},
        {'-', 1},
        {'*', 2},
        {'/', 2}
    };
    while (fgets(buf, 400, stdin) != NULL) {
        string expr = buf; //转换成C++风格的字符串,expression
        expr.pop_back(); //弹出最后的换行符
        if (expr == "0") {
            break;
        }
        expr.push_back('$'); //加上结尾
        string num; //用来收集单独的数字 1 3 -> 13
        stack<double> numStack;
        stack<char> operStack;
        for (int i = 0; i < expr.size(); i++) {
            if (expr[i] >= '0' &&
                    expr[i] <= '9') { //如果是数字,则追加到num后面
                num.push_back(expr[i]);
            } else if (expr[i] == ' ') { //直到读取到空格
                if (num != "") { //如果num有值,则放到操作数里
                    numStack.push(stod(num)); //stod(string s) 把s转换成double类型
                    num = "";
                }
            } else {
                if (expr[i] == '$') {
                    if (num != "") {
                        numStack.push(stod(num)); //stod(string s) 把s转换成double类型
                        num = "";
                    }
                }
                while (!operStack.empty() && priority[operStack.top()] >= priority[expr[i]]) {
                    double num1 = numStack.top();
                    numStack.pop();
                    double num2 = numStack.top();
                    numStack.pop();
                    char top = operStack.top();
                    operStack.pop();
                    switch (top) {
                        case '+':
                            numStack.push(num2 + num1);
                            break;
                        case '-':
                            numStack.push(num2 - num1);
                            break;
                        case '*':
                            numStack.push(num2 * num1);
                            break;
                        case '/':
                            numStack.push(num2 / num1);
                            break;
                    }
                }
                operStack.push(expr[i]);
            }
        }
	   //输出最后的字符
        printf("%.2lf\n", numStack.top());
        numStack.pop();
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 14:35
点赞 评论 收藏
分享
找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务