• 2010上交:计算表达式


    题目描述:

    对于一个不存在括号的表达式进行计算

    输入:

    存在多种数据,每组数据一行,表达式不存在空格

    输出:

    输出结果

    样例输入:
    6/2+3+3*4
    样例输出:
    18

    #include <iostream>
    #include <stack>
    using namespace std;
    typedef int TYPE;
    const int MAXN=1005;
    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;
        }
    }
    TYPE cal(TYPE x,TYPE y,char ch)
    {
        switch(ch)
        {
            case '+':return x+y;
            case '-':return x-y;
            case '*':return x*y;
            case '/':return x/y;
        }
    }
    int main()
    {
        while(cin>>buf)
        {
            stack<TYPE> it;
            stack<char> op;
            TYPE e=0;
            for(int i=0;buf[i];i++)
            {
                if(isNum(buf[i]))
                {
                    e*=10;
                    e+=(buf[i]-'0');
                }
                else
                {
                    it.push(e);
                    e=0;
                    if(op.empty())
                    {
                        op.push(buf[i]);
                    }
                    else
                    {
                        char now=buf[i];
                        char ctp=op.top();
                        int np=priority(now);
                        int tp=priority(ctp);
                        if(np>tp)
                        {
                            op.push(now);
                        }
                        else
                        {
                            do
                            {
                                char ch=op.top();op.pop();
                                TYPE y=it.top();it.pop();
                                TYPE x=it.top();it.pop();
                                TYPE z=cal(x,y,ch);
                                it.push(z);
                            }while(!op.empty()&&np<=priority(op.top()));
                            op.push(now);
                        }
                    }
                }
            }
            it.push(e);
            while(!op.empty())
            {
                char ch=op.top();op.pop();
                TYPE y=it.top();it.pop();
                TYPE x=it.top();it.pop();
                TYPE z=cal(x,y,ch);
                it.push(z);
            }
            TYPE res=it.top();
            cout<<res<<endl;
        }
        return 0;
    }

     简洁代码:

    #include <cstdio>
    using namespace std;
    const int MAXN=1005;
    int e[MAXN],top;
    int main()
    {
        int x;
        char op;
        while(scanf("%d",&x)!=EOF)
        {
            top=0;
            e[top++]=x;
            while(scanf("%c",&op)!=EOF)
            {
                if(op=='
    ')    break;
                scanf("%d",&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;
                }
            }
            int res=0;
            for(int i=0;i<top;i++)
            {
                res+=e[i];
            }
            printf("%d
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    NO 3 ,人生苦短,我学python之python 元祖tuple魔法
    NO 2,人生苦短,我学python之python 列表list的魔法
    NO 1,人生苦短,我学python之python 字符串的魔法
    几种常见登录验证的方式总结
    Spring Boot 解决跨域问题的 3 种方案
    浅析VO、DTO、DO、PO的概念、区别和用处
    对于分库分表的入门理解
    在项目启动后执行某段功能代码
    jna编程学习
    RabbitMQ详解
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5370360.html
Copyright © 2020-2023  润新知