题目描述
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值 在这里," /" 为整除 最终结果为正整数,数据保证不需要使用高精度!
输入
仅一行,即为表达式
输出
仅一行,既为表达式算出的结果 结果小于maxlongint,且整个计算的过程中,也不会超过maxlongint
样例输入
2^3+1
样例输出
9
提示
表达式总长度< =20
解题思路:
1,将数字和符号分别存放于数组中;
2,每次输入符号时,将前面所有小于或等于当前符号优先级的数据进行处理;
3,当最后一个数字输入时,从后往前对还存在的所有数据进行处理.
#include
#include
int fun(int a,int b,char c); //进行运算
int fun1(char ch); //各个符号所对应的值,与表格相对应
int main()
{
int Judge[5][5] = {{0,0,-1,-1,-1}, //构建符号间优先关系表格
{0,0,-1,-1,-1}, //从上往下,从左到右依次对应+,-,*,/,^
{1,1,0,0,-1}, //1代表高于,0表示同级,-1表示低于
{1,1,0,0,-1},
{1,1,1,1,0}};
char str[20],type[20]; //str表示输入,type储存符号
int num[20] = {0}; //num用于储存数字,且初始化为0,方便多位数的储存
int i,j = 0 , k = 0,len,t; //j表示数字个数,k表示符号个数
int sum; //sum表示计算得出的结果
scanf("%s",str);
len = strlen(str);
for(i = 0 ; i < len ; i++)
{
if(str[i]>='0'&&str[i]<='9')
{
num[j] += str[i] - '0'; //防止出现多位数字的情况,例:11+11,将11储存在一个数组元素中
if(str[i+1]>='0'&&str[i+1]<='9') num[j] *= 10;
else j++;
}
else
{
while(Judge[fun1(str[i])][fun1(type[k-1])] <= 0&&k-1>=0) //将前面所有小于或等于当前符号优先级的进行处理
{
k--; //符号出栈一位进行处理
sum = fun(num[j-2],num[j-1],type[k]); //将数据进行处理
j = j-2; //数字出栈两位
num[j++] = sum; //将运算的结果接着储存
num[j] = 0; //一定要赋0,不然会对后面的数字储存造成影响
}
}
if(str[i]<'0'||str[i]>'9') type[k++] = str[i];
if(i == len-1)
{
for(t = k-1 ; t >= 0 ; t--) //从后往前进行数据处理,因为后面符号的优先级可能会比前面的高
{
sum = fun(num[t],num[t+1],type[t]);
num[t] = sum;
}
}
}
printf("%d\n",sum);
return 0;
}
int fun(int a,int b,char c)
{
int i,sum;
if(c=='+') sum = a+b;
else if(c=='-') sum = a-b;
else if(c=='*') sum = a*b;
else if(c=='/') sum = a/b;
else if(c=='^')
{
sum = 1;
for(i = 0 ; i < b ; i++) //本来想用pow函数的,结果发现存在精度问题.比如:10^2==99
{
sum *= a;
}
}
return sum;
}
int fun1(char ch)
{
if(ch=='+') return 0;
else if(ch=='-') return 1;
else if(ch=='*') return 2;
else if(ch=='/') return 3;
else if(ch=='^') return 4;
return 0;
}