题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36
还是有点烦躁的一道题,需要细节处理
上代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std;
int main()
{
string s;
stack<char> fu;
stack<double> num;
double num1,num2;
while(1)
{
getline(cin,s);
if(s=="0")break;
for(int i=0;s[i];i++)
{
if(isdigit(s[i]))
{
num1=0.0;
while(isdigit(s[i]))
{
num1=num1*10+s[i]-'0';
i++;
}
i--;
num.push(num1);
}
if(s[i]=='+'||s[i]=='-')
{
if(fu.empty())
{
fu.push(s[i]);
}
else
{
char hao=fu.top();
fu.pop();
num1=num.top();
num.pop();
num2=num.top();
num.pop();
if(hao=='+')
{
num.push(num1+num2);
}
else
{
num.push(num2-num1);
}
fu.push(s[i]);
}
}
else if(s[i]=='*'||s[i]=='/')
{
char hao=s[i];
i+=2;
num2=0.0;
while(isdigit(s[i]))
{
num2=num2*10+s[i]-'0';
i++;
}
i--;
num1=num.top();
num.pop();
if(hao=='*')
{
num.push(num1*num2);
}
else
{
num.push(num1/num2);
}
}
}
while(!fu.empty())
{
char hao=fu.top();
fu.pop();
num2=num.top();
num.pop();
num1=num.top();
num.pop();
if(hao=='+')num.push(num1+num2);
else num.push(num1-num2);
}
printf("%.2lf\n",num.top());
num.pop();
}
return 0;
}