链接:https://vjudge.net/problem/HDU-1237
Task
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample
input:
1
2
3
|
1 + 2
4 + 2 * 5 - 7 / 11
0
|
output:
Solution
数字
空格
运算符
空格
数字
空格
运算符
空格
数字
空格
运算符
空格
数字
\n
读取输入时每一行先读前两个字符,如果是0\n
就退出,不是则将第一个(一定是数字
)压入栈中,第二个是空格
。
之后的字符串就以运算符
空格
数字
的组合用scanf
读进变量op
和n
,其后的空格
或最后一个\n
用getchar
读出。
由于只有加减乘除,没有括号,故计算的思路是:遇到加法就入栈,遇到减法就反号入栈,遇到乘除就和栈顶元素运算。到行尾时只需要将栈中元素相加即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include<cstdio>
#include<stack>
using namespace std;
char op,b;
double n,tmp;
int main(){
while(scanf("%lf%c",&n,&b)!=EOF){
// exit condition
if(n==0 && b=='\n') break;
stack<double> stk;
double ans=0;
stk.push(n);
while(scanf("%c %lf",&op,&n)!=EOF){
switch(op){
case '+':
stk.push(n);
break;
case '-':
stk.push(-n);
break;
case '*':
tmp=stk.top()*n;
stk.pop();
stk.push(tmp);
break;
case '/':
tmp=stk.top()/n;
stk.pop();
stk.push(tmp);
break;
}
if(b=getchar(), b=='\n') break;
}
while(!stk.empty()){
ans+=stk.top();
stk.pop();
}
printf("%.2lf\n",ans);
}
return 0;
}
|