简单计算器

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36

#include <stdio.h>
#include <string.h>
#include <stack>
#include <stdlib.h>
using namespace std;
char str[210];
int i;
double getNum(int x)
{
    double t=0;
    for(;str[x]!=' '&&str[x]!=0;++x)
    {
        t*=10;
        t+=(double)(str[x]-'0');
    }
    i=x;
    return t;
}
int main()
{
    double temp,t1,t2,ans=0;
    stack<char> op,reop;
    stack<double> data,redata;
//    freopen("in.txt","r",stdin);
    while (gets(str))
    {
        if (str[0]=='0'&&str[1]==0) break;
        for (i=0;i<strlen(str);++i)
        {
            t1=0;t2=0;temp=0;
            if(str[i]==' ')
                continue;
            else if (str[i]=='+'||str[i]=='-')
                op.push(str[i]);
            else if(str[i]=='/')
            {
                i+=2;
                t1=data.top();
                data.pop();
                ans=t1/getNum(i);
                data.push(ans);
            }
            else if(str[i]=='*')
            {
                i+=2;
                t1=data.top();
                data.pop();
                ans=t1*getNum(i);
                data.push(ans);
            }
            else
                data.push(getNum(i));
            
        }
        while (!op.empty())
        {
            reop.push(op.top());
            op.pop();
        }
        while (!data.empty())
        {
            redata.push(data.top());
            data.pop();
        }
        while (!reop.empty())
        {
            t1=redata.top();
            redata.pop();
            t2=redata.top();
            redata.pop();
            if (reop.top()=='-')
                ans=t1-t2;
            if (reop.top()=='+')
                ans=t1+t2;
            reop.pop();
            redata.push(ans);
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

 

posted @ 2013-03-01 16:31  丶Blank  阅读(248)  评论(0编辑  收藏  举报