表达式计算

输入一个由+、-、*、/、(、)和浮点数组成的合法表达式,计算并且输出其结果:

如输入:((1+2)*(2-1)+2-1*(1+1))时;
输出:3.000000

 

 

直接上代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<cmath>

using namespace std;
char mid[255];
stack<char>  fuhao;
stack<double>  shuzhi;

int compare(char a, char b){//运算符的优先级判定
    int x, y;
    switch(a){
        case '\0': x = -1; break;
        case '(': x = 0; break;
        case '+':
        case '-': x = 2;break;
        case '*':
        case '/':x = 3; break;
    }
    switch(b){
        case '\0': y = 5; break;
        case '(': y = 4; break;
        case '+':
        case '-': y = 2;break;
        case '*':
        case '/':y = 3; break;
    }
    if(x >= y) return 1;
    else return 0;
}

double jisuan(double a,double b, char op){//传入值和运算符进行计算
    switch(op){
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/':
            if(b == 0){printf("error!! 除数为零\n");exit(0);}
            return a / b;
    }
    return -1;
}
int mark = 0, point = 0, fwei = 0;
void count(char mid[]){
    char x = mid[0];
    int i = 1;
    fuhao.push('\0');
    shuzhi.push(0);
    while(x != '\0' || fuhao.top() != '\0'){
        if((x>='0' && x <='9') || x == '.'){
            mark = 1;
            if(x == '.')  {x = mid[i++];point = 1;fwei = 0;continue;}//如果有小数点
            if(point == 0){
                if(mark == 1)  shuzhi.push(x - '0');
                else shuzhi.push(shuzhi.top()*10+(x -'0'));
                x = mid[i++];
            }
            else if(point == 1){
                fwei++;
                double chulai = shuzhi.top();shuzhi.pop();
                shuzhi.push(chulai+double((x-'0')/(pow(10.0,fwei))));
                x = mid[i++];
            }
        }
        else{
            if(x == ' ')  {x = mid[i++];continue;mark = 0; point = 0;}
            else if(x == ')'){
                while(fuhao.top() != '('){
                    double b = shuzhi.top();shuzhi.pop();
                    double a = shuzhi.top();shuzhi.pop();
                    double yaru = jisuan(a, b, fuhao.top());
                    shuzhi.push(yaru);
                    fuhao.pop();
                }
                fuhao.pop();
                x = mid[i++];
                mark = 0; point = 0;
            }
            else if(x == '\0'){
                while(fuhao.top() != '\0'){
                    double b = shuzhi.top();shuzhi.pop();
                    double a = shuzhi.top();shuzhi.pop();
                    double yaru = jisuan(a, b, fuhao.top());
                    shuzhi.push(yaru);
                    fuhao.pop();
                }
                mark = 0; point = 0;
            }
            else{
                while(compare(fuhao.top(), x)){//若栈顶元素优先级高些
                    double b = shuzhi.top();shuzhi.pop();
                    double a = shuzhi.top();shuzhi.pop();
                    double yaru = jisuan(a, b, fuhao.top());
                    shuzhi.push(yaru);
                    fuhao.pop();
                }
                fuhao.push(x);
                x = mid[i++];
                mark = 0; point = 0;
            }
        }
    }
}

int main(){
    printf("请输入表达式:\n");
    gets(mid);
    count(mid);//计算表达式
    printf("%f", shuzhi.top());
    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值