简单计算器

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

double GetNum(string str,int& index){//用引用型 原参数的index会累加
    double num = 0;
    while (isdigit(str[index])){
        num = num * 10 + str[index]-'0';
        index ++;
    }
    return num;
}
int Priority(char x){
    if(x == '#'){
        return 0;
    }else if(x == '$'){
        return 1;
    }else if(x == '+' || x == '-'){
        return 2;
    }else{
        return 3;
    }
}
double Calculate(double a, double b,char c){
    if(c == '+'){
        return a+b;
    }else if(c == '-'){
        return a-b;
    }else if(c == '*'){
        return a*b;
    }else{
        return a/b;
    }
}
int main(){
    string str;
    while (getline(cin,str)){
        if(str =="0"){
            break;
        }
        stack<char> opt;
        stack<double> nums;
        opt.push('#');
        str += '$';//遍历到$时 前面运算符优先级比他高 计算;到最后opt栈里只有头#和尾$
        int i = 0;
//        for(int i=0;i < str.size();i++){
        while(i < str.size()){
            if(isdigit(str[i])){
                nums.push(GetNum(str,i));//这边如果数字等于两位数 i会跨2位 所以不能用for循环
            }else if(str[i]==' '){
                i ++;
            }else{
                if(Priority(opt.top()) >= Priority(str[i])){//表达式前面大于/等于后面运算符都要先计算
                    double b = nums.top();
                    nums.pop();
                    double a = nums.top();
                    nums.pop();
                    nums.push(Calculate(a,b,opt.top()));
                    opt.pop();
                }else{
                    opt.push(str[i]);
                    i ++;
                }
            }
        }
        printf("%.2f\n",nums.top());

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值