• 2006浙大:简单计算器


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

    #include <iostream>
    #include <stack>
    #include <iomanip>
    #include <string.h>
    using namespace std;
    const int MAXN=205;
    char buf[MAXN];
    bool isNum(char ch)
    {
        return '0'<=ch&&ch<='9';
    }
    int priority(char ch)
    {
        switch(ch)
        {
            case '+':return 1;
            case '-':return 1;
            case '*':return 2;
            case '/':return 2;
        }
    }
    double cal(char ch,double x,double y)
    {
        switch(ch)
        {
            case '+':return x+y;
            case '-':return x-y;
            case '*':return x*y;
            case '/':return x/y;
        }
    }
    int main()
    {
        while(cin.getline(buf,MAXN))
        {
            if(strlen(buf)==1&&buf[0]=='0')    break;
            stack<double> it;
            stack<char> op;
            double x=0;
            for(int i=0;buf[i];i++)
            {
                if(buf[i]==' ')    continue;
                if(isNum(buf[i]))
                {
                    x*=10;
                    x+=(buf[i]-'0');
                }
                else
                {
                    it.push(x);
                    x=0;
                    if(op.empty())
                    {
                        op.push(buf[i]);
                    }
                    else
                    {
                        char now=buf[i];
                        char tp=op.top();
                        int pn=priority(now);
                        int pt=priority(tp);
                        if(pn>pt)
                        {
                            op.push(now);
                        }
                        else
                        {
                            do
                            {
                                tp=op.top();op.pop();
                                double y=it.top();it.pop();
                                double x=it.top();it.pop();
                                double res=cal(tp,x,y);
                                it.push(res);
                                if(op.empty())    break;
                                pt=priority(op.top());
                            }while(pn<=pt);
                            op.push(now);
                        }
                    }
                }    
            }
            it.push(x);
            while(!op.empty())
            {
                char now=op.top();op.pop();
                double y=it.top();it.pop();
                double x=it.top();it.pop();
                double res=cal(now,x,y);
                it.push(res);
            } 
            double res=it.top();
            /*C++输出两位小数*/
            cout.setf(ios::showpoint);
            cout.precision(2);
            cout.setf(ios::fixed);
            cout<<res<<endl;
        }
        return 0;
    }

     简洁代码:

    #include <cstdio>
    using namespace std;
    const int MAXN=1005;
    double e[MAXN];
    int main()
    {
        double x;
        char op;
        while(scanf("%lf%c",&x,&op)!=EOF)
        {
            if(x==0&&op=='
    ')    break;
            int top=0;
            e[top++]=x;
            while(scanf("%c",&op)!=EOF)
            {
                scanf(" %lf",&x);
                switch(op)
                {
                    case '+':e[top++]=x;break;
                    case '-':e[top++]=-x;break;
                    case '*':e[top-1]*=x;break;
                    case '/':e[top-1]/=x;break;
                }
                if(getchar()=='
    ')    break;
            }
            double res=0;
            for(int i=0;i<top;i++)
            {
                res+=e[i];
            }
            printf("%.2f
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    TouTiao开源项目 分析笔记19 问答内容
    TouTiao开源项目 分析笔记18 视频详情页面
    TouTiao开源项目 分析笔记17 新闻媒体专栏
    TouTiao开源项目 分析笔记16 新闻评论
    TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现
    TouTiao开源项目 分析笔记14 段子评论
    计算机专业大学课程学习路线图
    Windows GitLab使用全过程
    2017年最后一天
    生成6个1~33之间的随机整数,添加到集合,并遍历集合
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5651070.html
Copyright © 2020-2023  润新知