简单计算器

简单计算器

http://www.nowcoder.com/questionTerminal/5759c29a28cb4361bc3605979d5a6130

/*
    运算表达式主要在设计优先级上
    无括号的情况下设置四个优先级(从高到低为):(* /)、(+ -)、($)、(#)
    其中#放栈底,$放字符串结尾
    遇到数字压入数字栈,遇到符号,如果优先级>栈顶优先级则压入,如果优先级<栈顶优先级则弹出栈顶和两个运算符进行运算,结果压入数字栈
    注意:当运算符栈中只有#和$的时候,数组栈中只剩一个数字,那就是结果 
*/

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int getleval(char op){
    if(op=='*'||op=='/'){
        return 2;
    }else if(op=='+'||op=='-'){
        return 1;
    }else if(op=='$'){
        return 0;
    }else return -1;
}
float compute(float x,float y,char op){
    if(op=='+'){
        return x+y;
    }else if(op=='-'){
        return x-y;
    }else if(op=='*'){
        return x*y;
    }else return x/y;
} 
int main(){
    string s;
    stack<char> op;
    stack<float> num;
    op.push('#');
    while(getline(cin,s)){
        if(s=="0")break;
        s+="$";
        float res=0;int i=0;
        while(i<s.size()){
            if(s[i]>='0'&&s[i]<='9'){
                res=0;
                while(s[i]>='0'&&s[i]<='9'){
                    res=res*10+s[i]-'0';
                    i++;
                }num.push(res);
            }else if(s[i]==' '){
                i++;
            }else{
                if(getleval(s[i])>getleval(op.top())){
                    op.push(s[i]);
                    i++;
                }else{
                    char o=op.top();
                    op.pop();
                    float num2=num.top();
                    num.pop();
                    float num1=num.top();
                    num.pop();
                    num1=compute(num1,num2,o);
                    num.push(num1);
                }
            }
        }printf("%.2f\n",num.top());
        num.pop();
        op.pop();
    }
    return 0;
}
全部评论

相关推荐

11-17 11:15
门头沟学院 Java
金山办公终于发offer了,但薪资和平台都不如已有的offer打算拒了,A不了薪资,不满意直接拒了,留给需要的人嘿嘿嘿时间线:10.14线下一面&nbsp;,10.23线上二面,下午发测评,11月1日HR面,11月14日电话谈薪,11月17日直接发offer
star__plat...:好兄弟干的好啊,解气。金山第一次笔难度高的离谱,第二次简单的离谱全A了,用人部门筛选中估计最后还是要挂我,就这今早智联招聘还给我发信息让我投
offer帮选
点赞 评论 收藏
分享
看起来名字可以很长:笑死 我暑期实习阿里云的意向也被 qq 邮箱放在垃圾箱了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务