链接:https://vjudge.net/problem/HDU-1237

Task

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample

input:

1
2
3
1 + 2
4 + 2 * 5 - 7 / 11
0

output:

1
2
3.00
13.36

Solution

数字 空格 运算符 空格 数字 空格 运算符 空格 数字 空格 运算符 空格 数字 \n 读取输入时每一行先读前两个字符,如果是0\n就退出,不是则将第一个(一定是数字)压入栈中,第二个是空格。 之后的字符串就以运算符 空格 数字的组合用scanf读进变量opn,其后的空格或最后一个\ngetchar读出。 由于只有加减乘除,没有括号,故计算的思路是:遇到加法就入栈,遇到减法就反号入栈,遇到乘除就和栈顶元素运算。到行尾时只需要将栈中元素相加即可。

 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;
}