蓝桥杯 表达式求解 (详解)-----------------------C语言
【摘要】
/*问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式 输入一行,包含一个表达式。 输出格式 输出这个表达式的值。 样例输入 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)