题目链接:acm.hdu.edu.cn/showproblem.php?pid=1237
简单计算器Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9055 Accepted Submission(s): 2932
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
Sample Output
|
解析:
字符串方式入栈,站定表示字符串尾,因此计算表达式时是从右向左计算的。
表达式的性质是从左向右,乘除优先,而加减左右无所谓了,因此需要单独处理乘除。
数据方面应注意:
0 + 0输出0.00而不是结束程序
1 / 2 / 2输出0.25
1 / 8 * 6输出0.75
参考代码:(该代码可优化----代码在main()中处理 加减时缀余,可在mul()中优化)
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char str[210];
stack <char> s;
double num=0;
double mul()
{
double p = s.top()-'0';
s.pop();
int t = 1;
while(!(s.empty() || s.top()==' '))
{
t *= 10;
p += (s.top()-'0')*t;
s.pop();
}
if(!s.empty())
s.pop();
if(s.empty() || s.top()=='+' || s.top()=='-')
return p;
if(s.top() == '/')
{
s.pop();s.pop();
return (double)mul()/p;
}
else if(s.top() == '*')
{
s.pop();s.pop();
return (double)mul()*p;
}
}
int main()
{
while(gets(str), strcmp(str, "0")!=0)
{
int len = strlen(str);
for(int i=0; i<len; i++)
{
s.push(str[i]);
}
double p = s.top()-'0';
s.pop();
int t = 1;
while(!(s.empty() || s.top()==' '))
{
t *= 10;
p += (s.top()-'0')*t;
s.pop();
}
if(!s.empty())
s.pop();
int tmp;
while(!s.empty())
{
if(s.top() == '/')
{
s.pop();
s.pop();
p = mul()/p;
}
else if(s.top() == '-')
{
s.pop();
s.pop();
tmp = s.top() - '0';
s.pop();
t = 1;
while(!(s.empty() || s.top()==' ') )
{
t *= 10;
tmp += (s.top()-'0')*t;
s.pop();
}
if(!s.empty())
s.pop();
num -= p;
p = tmp;
}
else if(s.top() == '*')
{
s.pop();s.pop();
p *= mul();
}
else if(s.top() == '+')
{
s.pop();s.pop();
num += p;
tmp = s.top() - '0';
s.pop();
t = 1;
while(!(s.empty() || s.top()==' ') )
{
t *= 10;
tmp += (s.top()-'0')*t;
s.pop();
}
if(!s.empty())
s.pop();
p = tmp;
}
}
num += p;
printf("%.2lf\n", num);
num = 0;
}
return 0;
}