2 1.000+2/4= ((1+2)*5+1)/4=
1.50 4.00
#include<stdio.h>
#include<cstdio>
#include<stack>
#include<stdlib.h>
using namespace std;
int in(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='=')
return 1;
return 0;
}
char pre(char a,char b)//a栈顶优先级判断
{
int i,j;
char fuhao[8]={'+','-','*','/','(',')','='};
char c[7][7]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},{'>','>','>','>',' ','>','>'},{'<','<','<','<','<',' ','='}};
// for(i=0;i<7;i++)
// {
// for(j=0;j<7;j++)
// printf("%c ",c[i][j]);
// printf("\n");
// }
for(i=0;i<7;i++)
if(a==fuhao[i])
break;
for(j=0;j<7;j++)
if(b==fuhao[j])
break;
// printf("i==%d,j==%d",i,j);
return c[i][j];
}
double calculate(double a,char c,double b)
{
switch(c)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
int main()
{
int n,j;
char ch,c,str[18];
double a,b,intg;
stack<double>opnd;
stack<char>oper;
scanf("%d",&n);
getchar();
while(n--)
{
ch=getchar();
oper.push('=');
while(ch!='='||oper.top()!='=')
{
if(!in(ch))//不是运算符进栈
{
// printf("%c\n",ch);
j=0;
while(!in(ch))
{
str[j++]=ch;
ch=getchar();
}
str[j]='\0';
intg=atof(str);
opnd.push(intg);
}
else
switch(pre(oper.top(),ch))
{
case '<'://栈顶元素优先级低
oper.push(ch);
ch=getchar();
break;
case '>'://退栈并将运算结果进栈
c=oper.top();
oper.pop();
b=opnd.top();
opnd.pop();
a=opnd.top();
opnd.pop();
// printf("%lf%lf%c\n",a,b,c);
opnd.push(calculate(a,c,b));
break;
case '='://脱括号并接收下一字符串
oper.pop();
ch=getchar();
break;
}
}
printf("%.2lf\n",opnd.top());
}
return 0;
}