zoukankan      html  css  js  c++  java
  • 简单计算器

    题目描述:
        读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
    输入:
        测试输入包含若干测试用例,每个测试用例占一行,每行不超过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;
    }
  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/aboutblank/p/2938999.html
Copyright © 2011-2022 走看看