蓝桥杯 表达式求解 (详解)-----------------------C语言

举报
Fivecc 发表于 2022/08/06 00:00:04 2022/08/06
【摘要】 /*问题描述   输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式   输入一行,包含一个表达式。 输出格式   输出这个表达式的值。 样例输入 1-2+3...

/*问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。*/


#include <stdio.h>
#include <string.h>
char a[101];
int b[101]={0};
int bj[100]={0};
int f(int ks,int js)//不含括号或剥去括号剩下的表达式计算 
{
    int x,t1;
    for(x=ks;x<=js;x++)           //  a*b+c
       if(bj[x]==0&&(a[b[x]]=='*'||a[b[x]]=='/'))// 找到运算符优先级高的 + - 小于 * / 
       {  if(a[b[x]]=='*')     //  运算符前一位 和后一位 操作 运算符 a*b
           b[x-1]=b[x-1]*b[x+1]; // D=a*b 再把 a‘=D ; 擦除*b  剩下 a'+c
        else b[x-1]=b[x-1]/b[x+1];
            t1=0;              
           while((x+2+t1)<(js+1))//通过 移位 覆盖法 去除已计算过 的值 
           {b[x+t1]=b[x+2+t1];
            bj[x+t1]=bj[x+2+t1];
              t1++;
           } js=js-2;x--;

       }
    for(x=ks;x<=js;x++)
       if(bj[x]==0&&(a[b[x]]=='+'||a[b[x]]=='-'))
       { if(a[b[x]]=='+') 
          b[x-1]=b[x-1]+b[x+1];
          else b[x-1]=b[x-1]-b[x+1];
           t1=0;
           while((x+2+t1)<(js+1))
           {b[x+t1]=b[x+2+t1];
             bj[x+t1]=bj[x+2+t1];
              t1++;
           } js=js-2;x--;

       }

    return b[ks];
}
int f2(int n)
{  if(n==0)return 1;
   else return f2(n-1)*10;
}

int main()
{int zh[100]={0};
int len,i,j,i1=0,s1=0,k,t,sum;
scanf("%s",&a);
len=strlen(a);

for(i=0;i<len;i++)//将所有运算符号的a[i]数组下标放入b[i1]中 只对 运算符号做判断 
if(a[i]<48)                 //a[i] 1 2 + 2 3 - 1
{if(s1!=0){                //      0 1 2 3 4 5 6
 for(j=s1-1;j>=0;j--)     //  b[i1] 12 2 23  5 1
 b[i1]+=zh[j]*f2(s1-1-j);//          0 1  2  3 4 
 bj[i1]=1;i1++;}       // 相当于将  12 + 23  - 1 存入 b[i1] 
   b[i1++]=i;  s1=0;}    //  bj[i1]  1 0  1  0 1  (0代表b[i1]存的是运算符号在a[i]中的下标 1代表存的数值)                      
  else
   {zh[s1++]=a[i]-48; }

    if(s1!=0)
 {for(j=s1-1;j>=0;j--) 
 b[i1]+=zh[j]*f2(s1-1-j);bj[i1]=1;i1++;}//处理 末尾为数值 

while(1)
 {
   for(i=0;i<i1;i++)          //'(' ')'相当于把 (a+b)*c 把 a+b从括号中截取出来
    if(bj[i]==0&&a[b[i]]=='(')// 先计算 D=a+b 然后将 (a+b)替换为D 然后算没括号的 D*c 
      {
        for(j=i+1;j<i1;j++)
          {
           if(bj[j]==0&&a[b[j]]=='(')break;//若先找到'(' 则当前'('优先级小于找到的'(';所以跳过从优先级最高的开始 
           if(bj[j]==0&&a[b[j]]==')')
           {
             b[i]=f(i+1,j-1);bj[i]=1;//找到当前高优先级 然后计算 括号里的 f(i+1,j-1) '('位替换为算出的数值 对应标记变为 1 
             k=1; 
              while(j+k<i1)
              { b[i+k]=b[j+k];//移位覆盖法擦去 
                bj[i+k]=bj[j+k];
                 k++;
              }i1=i1-(j-i);break; 

            } 
          }
      }    
      for(i=0;i<i1;i++)
    if(bj[i]==0&&a[b[i]]=='(')break;       
          if(i==i1)break;//剩下表达式不含括号时 跳出 

     } 
     sum=f(0,i1-1);//计算不含括号的表达式 
      printf("%d\n",sum);



return 0;
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96

文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。

原文链接:fivecc.blog.csdn.net/article/details/79756477

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。