题解 | #简单计算器#

简单计算器

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

// 描述
//    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
//输入描述:
//    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。
//    没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
//    整数 空格 运算符
//输出描述:
//    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

#include "cstdio"
#include "string"
#include "stack"
#include "map"

using namespace std;

int main() {
    char buf[1024];
    map<char, unsigned> priority = {
        {'+', 1}, {'-', 1},
        {'*', 2}, {'/', 2},
    };

    while (NULL != fgets(buf, sizeof buf, stdin)) {
        string input = buf;

        if ('0' == input[0]) {	// 这里借用了 最后一个字符\n 来清空 两个stack 从而保证最后的两个栈都被计算完了 没有剩余的数字与操作符
            break;
        }

        stack<char> op_stack;
        stack<double> num_stack;
        string num; // 用来存储字符拼凑出来的数字

        // 遍历表达式
        for (int i = 0; i < input.length(); ++i) {

            // 1. 字符读进来的数字
            if (input[i] >= '0' && input[i] <= '9') {
                num.push_back(input[i]);
            } else if (' ' == input[i]) {   // 2. 字符读进来的空格
                if (!num.empty()) {
                    num_stack.push(stod(num));
                    num.clear();
                }
            } else {

                // 前面的数字字符匹配结束了
                if (!num.empty()) {
                    num_stack.push(stod(num));
                    num.clear();
                }

                // 3. 字符读进来的操作服 + - * /
                while (!op_stack.empty() && priority[op_stack.top()] >= priority[input[i]]) {
                    char op = op_stack.top();
                    op_stack.pop();
                    double num1 = num_stack.top();
                    num_stack.pop();
                    double num2 = num_stack.top();
                    num_stack.pop();
                    switch (op) {
                        case '+':
                            num_stack.push(num2 + num1);
                            break;
                        case '-':
                            num_stack.push(num2 - num1);
                            break;
                        case '*':
                            num_stack.push(num2 * num1);
                            break;
                        case '/':
                            num_stack.push(num2 / num1);
                            break;
                    }
                }
                // 所有优先级大于等于当前运算符的运算都计算完毕
                op_stack.push(input[i]);
            }
        }
        while (!num_stack.empty()) {
            printf("%.2lf\n", num_stack.top());
            num_stack.pop();
        }
//        printf("%d\n", op_stack.empty());
    }

    return 0;
}

全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务