问题描述:输入一个中缀表达式,求解表达式的值。参加运算的数为double类型且为正数。
输入:对于一个算术表达式,每一个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。当表达式只有一个“=”时,输入结束。参加运算的数位double类型。
输出要求:对于每组数据输出一行,为表达式运算结果。输出保留两位小数。
输入样例
2+2=
20*(4.5-3)=
=
输出样例:
4.00
30.00
atof的用法:
atof():double atof(const char *str );
功 能: 把字符串转换成浮点数
str:要转换的字符串。
返回值:每个函数返回 double 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则返回值为 0.0。
函数说明 :atof()会扫描参数str字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回,str字符串可包含正负号、小数点或E(e)来表示指数部分。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<stack>
using namespace std;
int cmp(char c)
{
if(c=='=') return 0;
if(c=='-'||c=='+') return 1;
if(c=='*'||c=='/') return 2;
return 0;
}
void compute(stack<double>&num,stack<char>&op)
{
double b=num.top();
num.pop();
double a=num.top();
num.pop();
switch(op.top())
{
case'+':num.push(a+b);break;
case'-':num.push(a-b);break;
case'*':num.push(a*b);break;
case'/':num.push(a/b);break;
}
op.pop();
}
int main()
{
string c;
stack<double> num;
stack<char> op;
while(cin>>c)
{
if(c=="=") break;
int len=c.length();
for(int i=0;i<len;i++)
{
if(isdigit(c[i]))
{
double number=atof(&c[i]);
while( i<len && (isdigit(c[i])||c[i]=='.') ) i++;
i--; //一定要回到当前字符
num.push(number);
}
else
{
if(c[i]=='(') //左括号直接入栈
{
op.push(c[i]);
}
else if(c[i]==')') //右括号 出栈计算直到左括号为止
{
while(op.top()!='(') compute(num,op);
op.pop();
}
else if(op.empty()||cmp(c[i])>cmp(op.top())) //栈空或者当前字符比栈顶字符优先级要高 ,直接入栈
{
op.push(c[i]);
}
else //当前字符比栈顶字符优先级要低或者级别相同,那就出栈计算
{
while(!op.empty()&&cmp(c[i])<=cmp(op.top())) compute(num,op);
op.push(c[i]);
}
}
}
op.pop();
printf("%.2f\n",num.top());
num.pop();
}
return 0;
}