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;
    }
  • 相关阅读:
    Vue.js中使用iView日期选择器并设置开始时间结束时间校验
    侠客行
    myJRebel 已不可用
    开发.NET Core NuGet包并实现CI/CD
    独立部署GeoWebCache
    GeoServer中GeoWebCache(GWC)的使用
    使用VS Code编写Markdown文件
    GitHub团队协作流程
    打包发布到NPM并通过CDN访问
    使用VS Code编写Markdown文件
  • 原文地址:https://www.cnblogs.com/aboutblank/p/2938999.html
Copyright © 2011-2022 走看看