/*注意各个符号的优先级,建议看懂符号的优先级后在看代码。有助于你理解:以下为代码*/
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
#include<stdlib.h>
using namespace std;
double zhao1(double a,char op,double b)
{
switch(op)
{
case ‘+‘:return a+b;break;
case ‘-‘:return a-b;break;
case ‘*‘:return a*b;break;
case ‘/‘:return a/b;break;
}
}
char zhao2(char c1,char c2)
{
if(c1==‘+‘||c1==‘-‘)
{
if(c2==‘*‘||c2==‘/‘||c2==‘(‘)
return ‘<‘;
else
return ‘>‘;
}
if(c1==‘*‘||c1==‘/‘)
{
if(c2==‘(‘)
return ‘<‘;
else
return ‘>‘;
}
if(c1==‘(‘||c1==‘=‘)
{
if(c1==‘(‘&&c2==‘)‘||c1==‘=‘&&c2==‘=‘)
return ‘=‘;
else
return ‘<‘;
}
}
int main()
{
int T,k,i;
bool flag;
double x,y;
scanf("%d",&T);
while(T--)
{
char a[1000],t[1000],op;
scanf("%s",a);
stack<double> num;
stack<char> ch;
ch.push(‘=‘);
flag=false,k=0;
for(i=0;a[i]!=‘\0‘;)
{
if(a[i]>=‘0‘&&a[i]<=‘9‘||a[i]==‘.‘)
{
t[k++]=a[i++];
flag=true;
continue;
}
if(flag)
{
t[k]=‘\0‘;
num.push(atof(t));
flag=false;
k=0;
}
switch(zhao2(ch.top(),a[i]))
{
case ‘<‘:ch.push(a[i]),i++;break;
case ‘=‘:ch.pop(),i++;break;
case ‘>‘:
y=num.top(),num.pop();
x=num.top(),num.pop();
op=ch.top(),ch.pop();
num.push(zhao1(x,op,y));
}
}
printf("%.2lf\n",num.top());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。