题解 | #简单计算器#

简单计算器

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();
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-12 10:48
已编辑
秋招之苟:邻居家老哥19届双2硕大厂开发offer拿遍了,前几天向他请教秋招,他给我看他当年的简历,0实习实验室项目技术栈跟开发基本不沾边😂,我跟他说这个放在现在中厂简历都过不了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务