11.表达式求值(1)

成绩10开启时间2021年09月24日 星期五 20:00
折扣0.8折扣时间2021年10月10日 星期日 23:55
允许迟交关闭时间2021年10月17日 星期日 23:55

背景:

我们的教材中已经介绍了表达式求值的算法,现在我们将该算法的功能进行扩展,要求可以处理的运算符包括:+、-、*、/、%(整数取余)、^(乘方)、(、)。

要求:

采用算符优先算法,计算的中间结果只保留整数。

输入:

第一行为整数N。表示下面有N个表达式

从第二行起的后面N行为N个由整数构成的表达式

输出:

共N行,每行为相应表达式的计算结果。

如果判断出表达式有错误,则输出:error.

如果在计算过程中出现除数为0的情况,则输出:Divide 0.

特殊情况说明:

在表达式中,如果操作数出现负数(例如-8),则要特别注意。例如:
10加-8表示为:10+-8。
10减-8表示为:10--8。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 4↵
  2. 2^3↵
  3. 2^0↵
  4. 2^3^2↵
  5. 2^(3-1)^(10-8)↵
以文本方式显示
  1. 8↵
  2. 1↵
  3. 512↵
  4. 16↵
1秒64M0
测试用例 2以文本方式显示
  1. 11↵
  2. (2+8↵
  3. 2+8)↵
  4. 8/0↵
  5. 8/(8+5-13)↵
  6. 2^(2-5)↵
  7. 10-(80-30(/3*3+4↵
  8. 10-80-30)/3*3+4↵
  9. (2+8)(3+2)↵
  10. (2)3(8)↵
  11. 30(/3+3)+4↵
  12. 10(20-8)+2↵
以文本方式显示
  1. error.↵
  2. error.↵
  3. Divide 0.↵
  4. Divide 0.↵
  5. error.↵
  6. error.↵
  7. error.↵
  8. error.↵
  9. error.↵
  10. error.↵
  11. error.↵
1秒64M0
测试用例 3以文本方式显示
  1. 2↵
  2. 10(10)↵
  3. 14*10-(10)2↵
以文本方式显示
  1. error.↵
  2. error.↵
1秒64M0
测试用例 5以文本方式显示
  1. 14↵
  2. 18-32↵
  3. 18/4↵
  4. 18%3↵
  5. 10+20*4↵
  6. 10-20/4↵
  7. (18-3)*3↵
  8. 10*(10)↵
  9. (10+2)/(8-10)↵
  10. (2*3)/(5*2)↵
  11. 10-(80-30)/3*3+4↵
  12. (((2+8)*2-(2+4)/2)*2-8)*2↵
  13. (((8+2)*(4/2)))↵
  14. 10/0↵
  15. (10-80*2↵
以文本方式显示
  1. -14↵
  2. 4↵
  3. 0↵
  4. 90↵
  5. 5↵
  6. 45↵
  7. 100↵
  8. -6↵
  9. 0↵
  10. -34↵
  11. 52↵
  12. 20↵
  13. Divide 0.↵
  14. error.↵
1秒64M0

代码

最近要忙保研的事,就先把代码贴出来,题解之后会补上(也许补不上了也说不定哈哈哈)

#include <stdio.h>       
#include <stdlib.h>       
#include<string.h>     
#include<math.h>     
     
     
char pro[9][9]={     
    {'>','>','<','<','<','>','>','<','<'},    
    {'>','>','<','<','<','>','>','<','<'},   
    {'>','>','>','>','<','>','>','<','>'},     
    {'>','>','>','>','<','>','>','<','>'},      
    {'<','<','<','<','<','=',' ','<','<'},       
    {'>','>','>','>',' ','>','>','>','>'},       
    {'<','<','<','<','<',' ','=','<','<'},       
    {'>','>','>','>','<','>','>','<','>'},  
    {'>','>','>','>','<','>','>','<','>'}    
};     
     
int op(int a, int b, char opt)     
{     
    if(opt=='+')     
    {     
        return a+b;     
    }     
    else if(opt=='-')     
    {     
        return a-b;     
    }     
    else if(opt=='*')     
    {     
        return a*b;     
    }     
    else if(opt=='/')     
    {     
        if(b==0)     
        {     
            printf("Divide 0.\n");     
            return 0x3f3f3f3f;     
        }     
        else     
        {     
            return a/b;     
        }     
    }     
    else if(opt=='%')     
    {     
        return a%b;     
    }     
    else if(opt=='^')     
    {     
        if(b>=0)     
        {     
            return pow(a,b);     
        }     
        else     
        {     
            printf("error.\n");     
            return 0x3f3f3f3f;     
        }     
    }     
    else     
    {     
        printf("error.\n");     
        return 0x3f3f3f3f;     
    }     
}     
     
int shu[100010];     
char opt[100010];     
char ex[100010]; 
int main() 
{     
    int N;     
    int i,j,k,m,n,a,b;     
    int flag=0;     
    int flag1=0;     
    int flag2=0;     
    int flag3=0;     
    int flag4=0;     
    int flag5=0;     
    char Opt[9]={'+','-','*','/','(',')','#','^','%'};     
    memset(ex,'\0',sizeof(ex));     
    int exp=0,shup=-1,optp=-1;     
    scanf("%d",&N);     
    while(N--)     
    {     
        char c;     
        flag=2;     
        flag1=0;     
        flag2=0;     
        flag3=0;     
        flag4=0;     
        flag5=0;     
        k=0;     
        int fuhaoyou=0;     
        scanf("%s",ex);     
        strcat(ex,"#");      
        opt[++optp]='#';         
        for(a=0;a<=strlen(ex)-3;a++)     
        {     
            flag5=0;     
            int fuhao=a;     
            if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')     
            {     
                flag5++;     
                fuhao++;     
            }     
            if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')     
            {     
                flag5++;     
                fuhao++;     
            }     
            if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')     
            {     
                flag5++;     
                fuhao++;     
            }     
            if(flag5>=3)     
            {     
                printf("error.\n");     
                memset(ex,'\0',sizeof(ex));     
                memset(shu,0,sizeof(shu));     
                memset(opt,'\0',sizeof(opt));     
                shup=-1;     
                flag1++;     
                exp=0;     
                flag5=0;     
                optp=-1;     
                fuhaoyou++;     
                break;     
            }     
        }     
        while(ex[exp]!='#'||opt[optp]!='#')     
        {     
            if(fuhaoyou!=0)     
            {     
                break;     
            }     
            if(ex[exp]>='0'&&ex[exp]<='9')     
            {     
                if(flag==0)     
                {     
                    int aaa=0;     
                    aaa=shu[shup--]*10+(ex[exp++]-'0');     
                    shu[++shup]=aaa;     
                    flag=0;     
                }     
                else     
                {     
                    shu[++shup]=ex[exp++]-'0';     
                    flag=0;     
                }     
            }     
            else     
            {     
                if(flag4==1)     
                {     
                    shu[0]*=-1;     
                    flag4=0;     
                }     
                if(flag==1)     
                {     
                    if(ex[exp]=='+'||ex[exp]=='-'||ex[exp]=='*'||ex[exp]=='/'||ex[exp]=='^'||ex[exp]=='%')     
                    {     
                        printf("error.\n");     
                        flag1++;     
                        memset(ex,'\0',sizeof(ex));     
                        memset(shu,0,sizeof(shu));     
                        memset(opt,'\0',sizeof(opt));     
                        shup=-1;     
                        optp=-1;     
                        exp=0;     
                        break;     
                    }     
                }     
                if(ex[exp]=='(')     
                {     
                    flag=1;     
                    int s=exp+1;     
                    int d=s+1;     
                    if(ex[s]=='-'&&ex[d]>='0'&&ex[d]<='9')     
                    {     
                        flag=2;     
                        flag4=1;     
                        exp=s+1;     
                        opt[++optp]='(';     
                        continue; 
                    }     
                }     
                else     
                {     
                    flag=2;     
                }     
                if(optp==-1)     
                {     
                    printf("error.\n");     
                    memset(ex,'\0',sizeof(ex));     
                    memset(shu,0,sizeof(shu));     
                    memset(opt,'\0',sizeof(opt));     
                    flag1++;     
                    shup=-1;     
                    optp=-1;     
                    exp=0;     
                    break;     
                }     
                else     
                {     
                    char com=opt[optp--];     
                    char Ex;     
                    for(i=0;i<9;i++)     
                    {     
                        if(Opt[i]==com)     
                        {     
                            m=i;     
                        }     
                        if(Opt[i]==ex[exp])     
                        {     
                            n=i;     
                        }     
                    }     
                    Ex=pro[m][n];     
                    if(Ex=='<')     
                    {     
                        if(exp==0&&ex[exp]=='-')     
                        {     
                            flag4=1;     
                            exp++;     
                            optp++;     
                            continue;     
                        }     
                        opt[++optp]=com;     
                        opt[++optp]=ex[exp++];     
                             
                        continue;     
                    }     
                    else if(Ex=='=')     
                    {     
                        exp++;     
                        continue;     
                    }     
                    else if(Ex==' ')     
                    {     
                        printf("error.\n");     
                        memset(ex,'\0',sizeof(ex));     
                        memset(shu,0,sizeof(shu));     
                        memset(opt,'\0',sizeof(opt));     
                        shup=-1;     
                        flag1++;     
                        exp=0;     
                        optp=-1;     
                        break;     
                    }     
                    else     
                    {     
                        int q=exp-1;     
                        if(ex[exp]=='-')     
                        {     
                            if(ex[q]=='('||ex[q]=='*'||ex[q]=='/'||ex[q]=='%'||ex[q]=='+'||ex[q]=='-')     
                            {     
                                opt[++optp]=com;     
                                exp++;     
                                flag2=1;     
                                continue;     
                            }     
                        }     
                        if(flag2==1)     
                        {     
                            shu[shup]*=-1;     
                            flag2=0;         
                        }     
                        if(flag3==1)     
                        {     
                            shu[--shup]*=-1;     
                            shup++;     
                            flag3=0;     
                        }     
                        b=shu[shup--];     
                        a=shu[shup--];     
                        k=op(a,b,com);     
                        if(k==0x3f3f3f3f)     
                        {     
                            memset(ex,'\0',sizeof(ex));     
                            shup=-1;     
                            optp=-1;     
                            exp=0;     
                            memset(shu,0,sizeof(shu));     
                            memset(opt,'\0',sizeof(opt));     
                            break;     
                        }     
                        else     
                        {     
                            shu[++shup]=k;     
                        }     
                        continue;     
                    }     
                    exp++;     
                }     
                     
            }     
                 
        }     
        if(shup==0&&optp==0)     
        {     
            if(flag4==1)     
            {     
                printf("%d\n",-shu[shup]);     
                flag4=0;     
            }     
            else     
            {     
                printf("%d\n",shu[shup]);     
            }     
        }     
        else     
        {     
            if(k!=0x3f3f3f3f&&flag1==0)     
            {     
                printf("error.\n");     
            }     
        }     
        memset(ex,'\0',sizeof(ex));     
        memset(shu,0,sizeof(shu));     
        memset(opt,'\0',sizeof(opt));     
        exp=0;     
        fuhaoyou=0;     
        shup=-1;     
        flag1=0;     
        optp=-1;     
    }     
    return 0;     
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1397是一个简单算术表达式的问题。在这个问题中,我们需要计算一个给定的算术表达式的结果。 算术表达式可以包含数字、运算符和括号。在进行时,我们需要按照运算符的优先级和结合性来计算表达式。 具体的过程可以通过以下步骤来完成: 1. 首先,我们需要将表达式转化为逆波兰表达式(Reverse Polish Notation,RPN)的形式。逆波兰表达式是一种不含括号的表达式表示方法,它通过将运算符放在操作数的后面来表示运算顺序。 2. 接下来,我们使用栈来计算逆波兰表达式。遍历逆波兰表达式中的每个元素,如果是数字,则将其入栈;如果是运算符,则从栈中弹出相应数量的操作数进行计算,并将计算结果入栈。 3. 最后,当遍历完整个逆波兰表达式后,栈中只剩下一个元素,即为最终的计算结果。 举个例子来说明,假设我们要计算表达式"3 + 4 * 2 - (5 + 1)"的: 1. 首先,将表达式转化为逆波兰表达式:"3 4 2 * + 5 1 + -" 2. 使用栈来计算逆波兰表达式: - 遇到数字3,入栈: - 遇到数字4,入栈:[3, 4] - 遇到数字2,入栈:[3, 4, 2] - 遇到运算符*,从栈中弹出两个操作数4和2,计算结果4*2=8,将结果入栈:[3, 8] - 遇到运算符+,从栈中弹出两个操作数3和8,计算结果3+8=11,将结果入栈:[11] - 遇到数字5,入栈:[11, 5] - 遇到数字1,入栈:[11, 5, 1] - 遇到运算符+,从栈中弹出两个操作数5和1,计算结果5+1=6,将结果入栈:[11, 6] - 遇到运算符-,从栈中弹出两个操作数11和6,计算结果11-6=5,将结果入栈: 3. 最终的计算结果为5。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值