题解 | #简单计算器#

简单计算器

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

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

using namespace std;

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

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

    while (NULL != fgets(buf, sizeof buf, stdin)) {
        if ('0' == buf[0]) {
            break;
        }
        string input = buf;

        string num;
        stack<double> num_stack;
        stack<char> op_stack;
        for (int i = 0; i < input.length();
                ++i) {  // 这里保留\n 原因是 为了让最后的 op栈完全清空 参与彻底的计算
            // 最后的结果保留在num栈中

            // 1. 如果是数字
            if (input[i] >= '0' && input[i] <= '9') {
                num += input[i];
            } else if (' ' == input[i]) {
                //  2. 如果是空格
                // 2.1 如果前面的数字没处理
                if (!num.empty()) {
                    num_stack.push(stod(num));
                    num.clear();
                }
                // 2.2 如果数字处理了 就什么都不做

            } else {
                if (!num.empty()) {
                    num_stack.push(stod(num));
                    num.clear();
                }
                // 3. 如果是运算符
                // 3.1 如果运算符栈不为空 且当前运算符的优先级 低于 栈顶运算符,则参与计算,
                // 直至栈运算符为空, 或当前运算符优先级高于栈内运算符
                while (!op_stack.empty() && prior[op_stack.top()] >= prior[input[i]]) {
                    // 这里,当前运算符只是起比较作用 判断是否发动计算 并不会在这里入栈
                    char op = op_stack.top();
                    op_stack.pop();
                    double second_num = num_stack.top();
                    num_stack.pop();
                    double first_num = num_stack.top();
                    num_stack.pop();
                    switch (op) {
                        case '+':
                            num_stack.push(first_num + second_num);
                            break;
                        case '-':
                            num_stack.push(first_num - second_num);
                            break;
                        case '*':
                            num_stack.push(first_num * second_num);
                            break;
                        case '/':
                            num_stack.push(first_num / second_num);
                            break;
                    }
                }
                // 比当前运算符优先级高的运算符 都操作完了
                // 再对当前运算入栈
                op_stack.push(input[i]);
            }
        }
        printf("%.2lf\n", num_stack.top());
    }
}

全部评论

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务