7-2 求前缀表达式的值 (50分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

代码:

#include <stdio.h>
const int N = 40;
typedef struct node {
    double num;
    char op;
    int flag;
}node;

typedef struct stack{
    node ths;
}stack;

double js(double a, double b, char c) 
{
    switch (c) {
        case '+' : return a + b;
        case '-' : return a - b;
        case '*' : return a * b;
        case '/' : return a / b;
    }
}

int main()
{
    node a[N];
    int cnt = 0;
    char ch, ch1;
    stack st1[N];
    int top1 = 0;

    while ((ch = getchar()) && ch != '\n')  {
        if(ch == ' ') {
            continue;
        }
        double sum = 0;
        int flag = 1;
        if(ch == '-') {
            flag = -1;
            ch1 = ch;
            ch = getchar();
        }
        if(ch >= '0' && ch <= '9') {
            sum = ch - '0';
            while ((ch = getchar()) && ch != '\n' && ch != ' ') {
                if(ch >= '0' && ch <= '9') {
                    sum = sum * 10 + ch - '0';
                }
                else {
                    break;
                }
            }
            double x = 0.1;
            if(ch == '.') {
                while ((ch = getchar()) && ch != '\n' && ch != ' ') {
                    if(ch >= '0' && ch <= '9') {
                        sum = sum  + (ch - '0') * x;
                        x *= 0.1;
                    }
                    else {
                        break;
                    }
                }
            }
            a[cnt].flag = 1;
            a[cnt++].num = flag * sum;
        }
        else {
            a[cnt].flag = 0;
            a[cnt].op = ch;
            if(flag == -1) {
                 a[cnt].op = ch1;
            }
            cnt++;
        } 
        if(ch == '\n') {
            break;
        }
    }
    node t;
    for(int i = cnt - 1; i >= 0; i--) {
        if(a[i].flag == 1) {
            st1[top1++].ths = a[i];
        }
        else {
            double num1 = st1[--top1].ths.num;
            double num2 = st1[--top1].ths.num;
            t.flag = 1;
            if(a[i].op == '/' && num2 == 0) {
                printf("ERROR\n");
                return 0;
            }
            t.num = js(num1, num2, a[i].op);
            st1[top1++].ths = t;
        }
    }

    printf("%.1f\n", st1[top1 - 1].ths.num);

    // for(int i = 0; i < cnt; i++) {
    //     if(a[i].flag == 0) {
    //         printf("%c ", a[i].op);
    //     }
    //     else {
    //         printf("%f ", a[i].num);
    //     }
    // }
    return 0;
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值