BUAA大一下数据结构题解(表达式计算(支持空格,连乘,连除))

【问题描述】

从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的’=’字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中不含圆括号,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

【输入形式】

在控制台中输入一个以’=’结尾的整数算术运算表达式。

【输出形式】

向控制台输出计算结果(为整数)。

【样例1输入】

5 - 1 * 2 * 3 + 12 / 2 / 2  =

【样例1输出】

2

【样例2输入】

500 =

【样例2输出】

500

【样例1说明】

输入的表达式为5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整数运算规则,计算结果为2,故输出2。

【样例2说明】

输入的表达式为500 = ,没有运算符参与运算,故直接输出500。

算法之一提示:
1、可以利用gets函数,读取整行表达式;
2、对于空格,可以考虑首先去除表达式中的所有空格
3、可以设一计数器用来记录已读取、但未参加运算的运算符的个数,根据该计数器来判断如何进行运算;
4、可以设计一函数:实现二元整数算术运算。

第一次作业的题都是比较基本的题型,运用简单的知识就可以解决。

解题思路:根据题目的描述,需要我们计算的表达式并没有括号,属于较为简单的表达式,所以我们可以一个一个的读入表达式中的字符,并且实时计算表达式,并且进行更新。就题目给的例子而言,我们可以先读入三个数字和他们中间的两个运算符,因为读入两个运算符才能够判断表达式的优先级。如果是第一个运算符优先级高,就计算得到第一个数字和第二个数字对于它们中间的运算符的结果,然后将结果赋值给第一个数字,第三个数字赋值给第二个数字;如果第二个运算符的优先级高,那么就计算第二个数字和第三个数字相对于它们之间的运算符的结果,并将其赋值给第二个运算符。然后读入下一个运算符并判断是否为‘=’,不是的话进入下一个循环,读入第三个数字。需要注意的是,有三种两种基本情况。1、500=。2、4+2=。这两种情况需要判断。

后续大家还将学习后缀表达式,以及树相关的知识,解决这道题就有了更多的办法,而且不受是否有括号的限制了!数据结构只要努力学习,都可以很棒的!

参考代码;

#include <stdio.h>
int readinnumber()
{
    int a;//a是输入的数字
    scanf("%d",&a);
    return a;
}
char readinch()
{
    char b;//b为输入的运算符
    do
    {
        scanf("%c",&b);
    }while(b==' ');
    return b;
}
int check(char b1,char b2)//此函数是为了判断运算的优先级
{
    if(b1=='*'||b1=='/')
            return 0;
    else
        if(b2=='*'||b2=='/')
            return 1;
        else
            return 0;
}
int calculate(int x,char b,int y)//此函数是为了计算式子
{
    if(b=='*')
        return x*y;
    if(b=='/')
        return x/y;
    if(b=='+')
        return x+y;
    if(b=='-')
        return x-y;
}
int main()
{
    int one,two,three;//one代表左边的数字,two代表中间的数字,three代表右边的数字
    char left,right;//left代表one和two之间的运算符,right代表two个three之间的运算符
    one=readinnumber();//读入最左边的数字
    left=readinch();//读入第一个运算符
    if(left=='=')
        printf("%d",one);//如果表达式为一个数直接跟‘=’
    else
    {
        two=readinnumber();//读入中间的数字
        right=readinch();//读入右边的运算符
        if(right=='=')
            printf("%d",calculate(one , left,right));//计算输出结果
        else
        {
            while(right!='=')//停止条件读入‘=’
            {
                three=readinnumber();//读入右边的数字
                if(check(left,right)==0)//判断字符优先级
                {//说明left的优先级更大
                    one=calculate(one,left,two);//将one更新
                    two=three;//将two更新
                    left=right;//将left更新
                }
                else
                {//说明right优先级更大
                    two=calculate(two,right,three);//更新two

                }
                right=readinch();//读入下一个运算符
            }
            printf("%d",calculate(one,left,two));//由于上述循环的结果为一个只包含两个数字和表达式,直接计算得到结果
        }

    }
    return 0;
}

(仅为大家提供思路,千万不要直接复制粘贴,BUAA有非常厉害的查重系统!)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值