题解 | 简单计算器

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

int priority(char c){
    if(c=='#')return 0;
    else if(c=='$')return 1;
    else if(c=='+'||c=='-')return 2;
    else return 3;
}

double getNum(string s,int& index){
    double num=0;
    while(isdigit(s[index])){
        num*=10;
        num+=s[index++]-'0';
    }
    return num;
}

double calculate(double x,double y,char op){
    double ans=0;
    if(op=='+')ans=x+y;
    else if(op=='-')ans=x-y;
    else if(op=='*')ans=x*y;
    else if(op=='/')ans=x/y;
    return ans;
}

int main(){
    string s;
    while(getline(cin,s)){
        if(s=="0")break;
        int index=0;
        std::stack<char> op;
        stack<double> data;
        s+='$';
        op.push('#');
        while(index<s.size()){
            if(s[index]==' ')index++;
            else if(isdigit(s[index]))data.push(getNum(s,index));
            else {
                if(priority(s[index])>priority(op.top())){
                    op.push(s[index]);index++;
                }else{
                    double y=data.top();
                    data.pop();
                    double x=data.top();
                    data.pop();
                    data.push(calculate(x,y,op.top()));
                    op.pop();
                }
            }
        }
        printf("%.2f\n",data.top());
    }
}

核心难度有三点,首先是数据的获取,我们要得到数据,需要扫描所有连续的数值,然后组合成一个真实的数,然后第二个难度就是如何完成扫描,我们要想要得到结果,需要根据字符串的顺序获取数值和符号,数值有多位,因此采用获取的同时给数字的情况,然后是符号,符号就是一位,直接获取即可,然后是空格,空格直接过就可以了,关于符号,这里就是我们的核心内容,获取符号的时候一定获取到了数值,这时候,我们只需要根据压栈计算规则运算即可,这是第三点,压栈计算怎么做,只要给不同等级的符号进行标记等级,比内部高则压入,比内部低则优先计算内部一个符号,就可以完成目标了。

全部评论

相关推荐

01-16 18:34
四川大学 Java
欢迎加入AI:没有啥稳定不稳定,一切都源于业务快速发展还是收缩。我当年一开始去的央企,业务不赚钱,也贼卷,慢慢就开始优化了。。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务