表达式求值
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00
来源
上传者
/*这是一个典型的堆栈问题,原理就是判断第二个运算符的优先级是不是比前一个高,高的话,又看下一个否则计算前面的。过程:从字符开始到结束,如果是数字,存进数字栈。是字符的话,先判断字符栈是否为空 1.空的话,字符放进运算符栈。2.非空就判断运算符栈顶的运算符是否高于它,高的话,请出栈,从数字栈拿出二个数字计算,然后将结果放回数字栈,继续判断字符栈顶,直到优先级低于它,然后进栈。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 1005
typedef struct
{
double data1[max];
int top1;
}sqstack1;
typedef struct
{
char data2[max];
int top2;
}sqstack2;
double func(char str[]);
int main()
{
char str[max];
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
printf("%.2lf\n",func(str));
}
return 0;
}
double func(char str[])
{
sqstack1 *s1;
sqstack2 *s2;
int i;
double a,b;
char e;
s1=(sqstack1 *)malloc(sizeof(sqstack1));//shu
s2=(sqstack2 *)malloc(sizeof(sqstack2));//zifu
s1->top1=s2->top2=-1;
for(i=0;str[i]!='\0';i++)
switch(str[i])
{
case '=':break;
case '(':
s2->top2++;
s2->data2[s2->top2]='(';
break;
case ')':
e=s2->data2[s2->top2--];
while(e!='(')
{
b=s1->data1[s1->top1--];
a=s1->data1[s1->top1--];
s1->top1++;
if(e=='-')
s1->data1[s1->top1]=a-b;
else if(e=='+')
s1->data1[s1->top1]=a+b;
else if(e=='*')
s1->data1[s1->top1]=a*b;
else
s1->data1[s1->top1]=a/b;
e=s2->data2[s2->top2--];
}
break;
case '+':
case '-':
if(s2->top2==-1)
{
s2->top2++;
s2->data2[s2->top2]=str[i];
break;
}
e=s2->data2[s2->top2];
while(e!='(')
{
b=s1->data1[s1->top1--];
a=s1->data1[s1->top1--];
s1->top1++;//jin zhan
if(e=='-')
s1->data1[s1->top1]=a-b;
else if(e=='+')
s1->data1[s1->top1]=a+b;
else if(e=='*')
s1->data1[s1->top1]=a*b;
else
s1->data1[s1->top1]=a/b;
s2->top2--;//出站
if(s2->top2==-1)//kong!!!
break;
e=s2->data2[s2->top2];
}
s2->top2++;
s2->data2[s2->top2]=str[i];//jin zhan
break;
case '*':
case '/':
if(s2->top2==-1)
{
s2->top2++;
s2->data2[s2->top2]=str[i];
break;
}
e=s2->data2[s2->top2];
while(e=='*'||e=='/')
{
s2->top2--;//出站
b=s1->data1[s1->top1--];
a=s1->data1[s1->top1--];
s1->top1++;//jin zhan
if(e=='*')
s1->data1[s1->top1]=a*b;
else
s1->data1[s1->top1]=a/b;
e=s2->data2[s2->top2];
}
s2->top2++;
s2->data2[s2->top2]=str[i];
break;
default:
double t=0,k=-1;
while(str[i]>='0'&&str[i]<='9')
{
t=t*10+str[i]-'0';
i++;
}
if(str[i]=='.')
{
i++;
while(str[i]>='0'&&str[i]<='9')
{
t+=(str[i]-'0')*pow(10,k);
k--;
i++;
}
}
s1->top1++;
s1->data1[s1->top1]=t;
i--;
}
while(s2->top2!=-1)
{
e=s2->data2[s2->top2--];//chuzhan
b=s1->data1[s1->top1--];
a=s1->data1[s1->top1--];
s1->top1++;//jin zhan
if(e=='-')
s1->data1[s1->top1]=a-b;
else if(e=='+')
s1->data1[s1->top1]=a+b;
else if(e=='*')
s1->data1[s1->top1]=a*b;
else
s1->data1[s1->top1]=a/b;
}
a=s1->data1[s1->top1];
free(s1);free(s2);
return a;
}