简单的表达式计算(中缀、前缀、后缀)

利用中缀表达是现实计算

中缀表达式入一下形式:
3+4 * 5 * (2+3)
((3+5 * 2)+3)/5+6/4 * 2+3

所谓的中缀表达是就是我们正常计算时候使用的表达式
代码如下:

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
const int Min = 1e-6;
const int maxsize =  1e3;
int opt(float a, float b, char type, float &result)
{
    if(type == '+'){

            result = a + b;
            return 1;
    }
    else if(type == '-'){
            result = a - b;
            return 1;
    }
    else if(type == '*'){
            result = a * b;
            return 1;
    }
    else if(type == '/')
    {
        if(fabs(b) < Min){
               // cout<<"-----------b"<<b<<endl;
                return 0;
        }
        else
        {
            result = a / b;
            return 1;
        }
    }
}
int GetPriority(char type)
{
    if(type == '+' || type == '-')return 0;
    else return 1;
}
float Cal(char exp[])
{
    int i = 0, top1 = -1, top2 = -1;//s1用来存储数字,s2用来存储符号
    float s1[maxsize];
    char s2[maxsize];
    while(exp[i] != '\0')
    {

        if(exp[i] >= '0' && exp[i] <= '9' )
        {
            //cout<<i<<" "<<exp[i]<<endl;
            s1[++top1] = exp[i] - '0';
            i++;

        }
        else if(exp[i] == '(')
        {
            //cout<<i<<" "<<exp[i]<<endl;
            s2[++top2] = exp[i];
            i++;

        }
        else if(exp[i] == '+'||exp[i] == '-'||exp[i] == '*'||exp[i] == '/')
        {
            if(top2 == -1 || s2[top2] == '(' || GetPriority(exp[i]) > GetPriority(s2[top2]))
            {
                s2[++top2] = exp[i];
                //cout<<i<<" "<<exp[i]<<endl;
                i++;
            }
            else
            {
                float a, b, res;
                char type;
                b = s1[top1--];
                a = s1[top1--];

                type = s2[top2--];

                int flag = opt(a, b, type, res);
                // cout<<"a   b"<<a<<" "<<b<<" "<<type<<endl;
                //cout<<" res "<<res<<endl;
                if(!flag)printf("计算出现问题\n");
                s1[++top1] = res;

            }
        }
        else if(exp[i] == ')')
        {
            while(s2[top2] != '(')
            {
                float a, b, res;
                char type;
                b = s1[top1--];
                a = s1[top1--];
                type = s2[top2--];

                int flag = opt(a, b, type, res);
                // cout<<"a   b"<<a<<" "<<b<<" "<<type<<endl;
                //cout<<" res "<<res<<endl;
                if(!flag)printf("计算出现问题\n");
                s1[++top1] = res;
            }
            --top2;
            i++;
        }



    }
    while(top2 != -1)
    {
        float a, b, res;
        char type;
        b = s1[top1--];
        a = s1[top1--];
        type = s2[top2--];
        //cout<<"a   b"<<a<<" "<<b<<" "<<type<<endl;
        int flag = opt(a, b, type, res);
        //cout<<" res "<<res<<endl;
        if(flag == 0)printf("计算出现问题\n");
        s1[++top1] = res;
    }
    return s1[top1];


}

int main()
{
    char a[100];
    int n;
    scanf("%s", a);
    //cout<<a<<endl;
    float res = Cal(a);
    printf("%.5f\n",res );


}
/*
11
3+4*5*(2+3)

((3+5*2)+3)/5+6/4*2+3
*/


利用后缀表达是现实计算

后缀表达式入一下形式:
345 * 23+ * +
352 * +3+5/64/2 * 3++

所谓的后缀表达是就是我们正常计算时候使用的表达式
代码如下:

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
const int Min = 1e-6;
const int maxsize =  1e3;
int opt(float a, float b, char type, float &result)
{
    if(type == '+')
    {

        result = a + b;
        return 1;
    }
    else if(type == '-')
    {
        result = a - b;
        return 1;
    }
    else if(type == '*')
    {
        result = a * b;
        return 1;
    }
    else if(type == '/')
    {
        if(fabs(b) < Min)
        {
            // cout<<"-----------b"<<b<<endl;
            return 0;
        }
        else
        {
            result = a / b;
            return 1;
        }
    }
}

float Cal(char exp[])
{
    float s[maxsize];
    int top = -1;
    for(int i = 0; exp[i] != '\0'; i++){
        if(exp[i] >= '0' && exp[i] <= '9'){
            s[++top] = exp[i] - '0';
        }
        else {
            float a, b, res;
            char type;
            type = exp[i];
            b = s[top--];
            a = s[top--];
            int flag = opt(a, b, type, res);
            if(!flag)puts("出现问题!");
            s[++top] = res;
            //printf("%.6f\n", res);
        }
    }
    return s[top];

}
int main()
{
    char a[maxsize];
    scanf("%s", a);
    float res = Cal(a);
    printf("%.5f\n", res);
    return 0;
}

/*

345*23+*+
352*+3+5/64/2*3++

*/

利用前缀表达是现实计算

前缀表达式入一下形式:
+3 * 4 * 5+23
所谓的前缀表达是就是我们正常计算时候使用的表达式
代码如下:

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
const int Min = 1e-6;
const int maxsize =  1e3;
int opt(float a, float b, char type, float &result)
{
    if(type == '+')
    {

        result = a + b;
        return 1;
    }
    else if(type == '-')
    {
        result = a - b;
        return 1;
    }
    else if(type == '*')
    {
        result = a * b;
        return 1;
    }
    else if(type == '/')
    {
        if(fabs(b) < Min)
        {
            // cout<<"-----------b"<<b<<endl;
            return 0;
        }
        else
        {
            result = a / b;
            return 1;
        }
    }
}

float Cal(char exp[])
{
    float s[maxsize];
    int top = -1;
    for(int i = strlen(exp)-1; i >= 0; i--){
        if(exp[i] >= '0' && exp[i] <= '9'){
            s[++top] = exp[i] - '0';
        }
        else {
            float a, b, res;
            char type;
            type = exp[i];
            a = s[top--];
            b = s[top--];
            int flag = opt(a, b, type, res);
            if(!flag)puts("³öÏÖÎÊÌâ!");
            s[++top] = res;
            //printf("%.6f\n", res);
        }
    }
    return s[top];

}
int main()
{
    char a[maxsize];
    scanf("%s", a);
    float res = Cal(a);
    printf("%.5f\n", res);
    return 0;
}

/*

+3*4*5+23
*/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值