杭电简单计算器

来源:互联网 发布:ysl口红推荐 知乎 编辑:程序博客网 时间:2024/06/06 03:51


/*Problem Description

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


Input

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


Output

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


Sample Input

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


Sample Output

3.00
13.36
*/
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
int main()
{
    char a[200],ch;
    int i;
    double b,c,d;
    stack<char>s1;
    stack<double>s2;
    while(gets(a)&&a[0]!=0&&strlen(a)!=1){
        b=0;
        for(i=0;i<strlen(a);i++){
            if(a[i]==' '){
                i++;
                if(s1.empty()){
                    s1.push(a[i]);
                    s2.push(b);
                }
                else{
                    if((s1.top()=='+'||s1.top()=='-')&&(a[i]=='*'||a[i]=='/')){
                        s1.push(a[i]);
                        s2.push(b);
                    }
                    else{
                            s2.push(b);
                        while(!s1.empty()){
                            if((s1.top()=='+'||s1.top()=='-')&&(a[i]=='*'||a[i]=='/'))break;
                            else{
                                b=s2.top();s2.pop();c=s2.top();s2.pop();
                                ch=s1.top();s1.pop();
                                switch(ch){
                                    case '+':d=c+b;s2.push(d);break;
                                    case '-':d=c-b;s2.push(d);break;
                                    case '*':d=c*b;s2.push(d);break;
                                    case '/':d=c*1.0/b;s2.push(d);break;
                                }
                            }
                        }
                        s1.push(a[i]);
                    }
                }
                i++;b=0;
            }
            else{
                b=b*10+(int)(a[i]-'0');
            }
        }
        s2.push(b);
        while(!s1.empty()){
            b=s2.top();s2.pop();c=s2.top();s2.pop();ch=s1.top();s1.pop();
            switch(ch){
                    case '+':d=c+b;s2.push(d);break;
                    case '-':d=c-b;s2.push(d);break;
                    case '*':d=c*b;s2.push(d);break;
                    case '/':d=c*1.0/b;s2.push(d);break;
                }
        }
        printf("%.2lf\n",s2.top());
        s2.pop();
    }
    return 0;
}

0 0
原创粉丝点击