题解 | #简单计算器#

简单计算器

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

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

stack<float> num;//数字栈
stack<char> oper;//运算符栈
bool Calculate(int flag) {
    float right = num.top();
    num.pop();
    float left = num.top();
    num.pop();//提取两个数字
    oper.pop();
    switch (flag) {
        case 1://加法
            if (oper.size() >= 1) {//减法需要特别处理
                (oper.top() == '-') ? num.push(0 - left + right) : num.push(left + right);
                oper.pop();//将减法换成加法
                oper.push('+');
            } else {
                num.push(left + right);
            }
            break;
        case 2://减法
            if (oper.size() >= 1) {
                (oper.top() == '-') ? num.push(0 - left - right) : num.push(left - right);
                oper.pop();//将减法换成加法
                oper.push('+');
            } else {
                num.push(left - right);
            }
            break;
        case 3://乘法
            num.push(left * right);
            break;
        case 4://除法
            num.push(left / right);//计算后的结果压入数据栈
            break;
    }
    return true;
}

int main() {
    char s[201];
    while (fgets(s, 201, stdin)) {
        string str = s;
        if (str == "0\n") {
            break;//只有0输入时退出循环
        }
        for (int i = 0; i < str.size() - 1; i++) {
            if ('0' <= str[i] && str[i] <= '9') {
                float data = 0;
                while ('0' <= str[i] && str[i] <= '9') {
                    data = data * 10 + str[i] - '0';
                    i++;
                }
                num.push(data); //拼接数字并压入数字栈
                if (!oper.empty()) {
                    (oper.top() == '*') ? Calculate(3) : ((oper.top() == '/') ? Calculate(
                            4) : false);//先计算优先级高的乘除
                }
            } else if (str[i] == ' ') {
                continue;//空格时忽略
            } else {
                oper.push(str[i]);//压入运算符栈
            }
        }
        while (num.size() != 1 &&
                !oper.empty()) { //退出条件为运算符全部使用完毕并且只剩一个结果
            if (oper.top() == '+') {
                Calculate(1);
            } else if (oper.top() == '-') {
                Calculate(2);
            }
        }
        printf("%.02f\n", num.top());
        num.pop();//清空数据栈,方便下组数据使用
    }
}
// 64 位输出请用 printf("%lld")

渣渣思路:乘除应该提前计算,出栈只计算加减时需要考虑将减法结合数字变为加负数

全部评论

相关推荐

冷艳的小师弟在看机会:jd测评乱点直接被挂了,哭死~
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务