2 1.000+2/4= ((1+2)*5+1)/4=
1.50 4.00
#include<cstdio>
#include<cctype>
#include<stack>
#include<cstring>
#include<cstdlib>
using namespace std;
void Calculate(stack<double>& opnd,stack<char>& optr)
{
double result,a,b;
b=opnd.top();
opnd.pop();
a=opnd.top();
opnd.pop();
char op=optr.top();
optr.pop();
switch(op)
{
case ‘+‘:
result=a+b;
break;
case ‘-‘:
result=a-b;
break;
case ‘*‘:
result=a*b;
break;
case ‘/‘:
result=a/b;
break;
}
opnd.push(result);
}
int PriThan(char a,stack<char>& optr)
{
if(a==‘(‘)
return 0;
if(optr.top()==‘(‘)
return 1;
if(a==‘+‘||a==‘-‘)
return 0;
if(optr.top()==‘*‘||optr.top()==‘/‘)
return 0;
return 1;
}
int main(int argc,char *argv[])
{
stack<double> opnd;
stack<char> optr;
int i,n,len;
char str[1005];
scanf("%d",&n);
getchar();
while(n--)
{
scanf("%s",str);
len=strlen(str);
for(i=0;i<len;i++)
{
if(isdigit(str[i]))
{
double num=atof(&str[i]);
while(i<len&&(isdigit(str[i])||str[i]==‘.‘))
i++;
i--;
opnd.push(num);
}
else if(str[i]==‘(‘)
optr.push(str[i]);
else if(str[i]==‘)‘)
{
while(optr.top()!=‘(‘)
Calculate(opnd,optr);
optr.pop();//弹出‘(’
}
else
{
while(!optr.empty())
{
if(!PriThan(str[i],optr))//栈顶运算符的优先级高于
{ //字符c,那么对栈顶运算符进行计算
Calculate(opnd,optr);
}
else
break;
}
optr.push(str[i]);
}
}
optr.pop();
while(!optr.empty())
Calculate(opnd,optr);
printf("%.2f\n",opnd.top());
opnd.pop();
}
return 0;
}
原文:http://blog.csdn.net/u012736084/article/details/19006891