题解 | #简单计算器# #中缀表达式运算#

简单计算器

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

题解:参考数据结构“中缀表达式”计算方法

采用两个栈,一个压数字,一个压运算符。每弹出一个运算符需要弹出两个数字,运算完成后将结果压入数字栈即可。

#include<bits/stdc++.h>
#include <iomanip>
using namespace std;

// +、-无法压住+、-、*、/,因此需要提前运算一次
bool needYunSuan(char c, char top) {
    if ((c == '*' || c == '/') && (top == '+' || top == '-')) {
        return false;
    } else {
        return true;
    }
}

double calculate(double num1, double num2, char c) {
    if (c == '+') {
        return num1 + num2;
    } else if (c == '-') {
        return num1 - num2;
    } else if (c == '*') {
        return num1 * num2;
    } else if (c == '/') {
        return num1 / num2;
    } else {
        return -1;
    }
}

void process(stack<double>& nums, stack<char>& fuhao) {
    double num2 = nums.top();
    nums.pop();
    double num1 = nums.top();
    nums.pop();
    char c = fuhao.top();
    fuhao.pop();
    nums.push(calculate(num1, num2, c));
}

// 表达式中只有非负整数
int getCurNum(string str, int &pos) {
    int num=0;
    while(pos< str.length()) {
        if(str[pos]>='0'&& str[pos]<='9') {
            num = num*10+(str[pos]-'0');
            pos++;
        } else {
            break;
        }
    }
    return num;
}

// 例题:5.6
int main() {
    string str;
    while (getline(cin, str)) {
        if (str == "0") {
            break;
        }
        stack<double> nums;
        stack<char> fuhao;
        for (int i = 0; i < str.size(); i++) {
            if (str[i] == ' ') {
                continue;
            }
            // 采用两个栈进行中缀表达式运算
            if (str[i] >= '0' && str[i] <= '9') {
                nums.push(getCurNum(str, i));
            } else if (!fuhao.empty() && needYunSuan(str[i], fuhao.top())) {
                i--;
                process(nums, fuhao);
            } else {
                fuhao.push(str[i]);
            }
        }
        while(!fuhao.empty()) {
            process(nums, fuhao);
        }
        cout<< fixed<<setprecision(2)<< nums.top()<< endl;
        nums.pop();
    }
    return 0;
}

全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务