zoukankan      html  css  js  c++  java
  • 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈

    秋实大哥搞算数

    Time Limit: 1 Sec  Memory Limit: 256 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/1074

    Description

    秋实大哥大学物理挂科了,于是在下学期的前两周的某一天要悲剧的补考。为了不给学校的挖掘机大楼做贡献,秋实大哥决定在假期里努力复习。当然,良好的计算 能力也是非常必要的,毕竟是涉及计算自己做多少分的题能够通过考试的问题。现在他给自己出了一大堆长长的只有涉及整形四则运算式子,然后埋头计算结果。为 了检验自己的计算能力,他请你来帮忙。


    Input

    第一行一个整数T,表示式子的总数。

    接下来每一行有一个长度不超过10^6的表达式,只包含数字和四则运算符号('+', '-', '*', '/')。
    1000000000.

    Output

    对于每一个表达式,输出相应的结果,占一行。

    保证运算及结果在long long范围以内。


    Sample Input

    2
    12+5/4-1
    4*5/3

    Sample Output

    12
    6

    HINT


    题意


    题解:

    首先用一个栈把中序遍历变为后序遍历,然后再随便用栈搞一搞就好了
    蛤,你听不懂?
    那就百度吧~

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 1002001
    #define mod 10007
    #define eps 1e-9
    //const int inf=0x7fffffff;   //无限大
    const int inf=0x3f3f3f3f;
    /*
    inline ll read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int buf[10];
    inline void write(int i) {
      int p = 0;if(i == 0) p++;
      else while(i) {buf[p++] = i % 10;i /= 10;}
      for(int j = p-1; j >=0; j--) putchar('0' + buf[j]);
      printf("
    ");
    }
    */
    //**************************************************************************************
    
    
    ll num[maxn];
    //stack<ll> ss;
    map<char,ll> op;
    struct sta
    {
        int kiss=0;
        ll ss[maxn];
        void pop()
        {
            //return ss[kiss];
            kiss--;
        }
        void push(ll x)
        {
            ss[++kiss]=x;
        }
        ll top()
        {
            return ss[kiss];
        }
        int empty()
        {
            if(kiss==0)
                return 1;
            return 0;
        }
    };
    sta sss;
    int check(ll k, char op2)
    {
        if(k!=op['+']&&k!=op['-']&&k!=op['*']&&k!=op['/'])
        {
            return 1;
        }
        char op1;
        int flag=0;
        if(k==op['/'])
        {
            op1='/';
            flag=1;
        }
        if(k==op['*'])
        {
            op1='*';
            flag=1;
        }
        if(k==op['-'])
        {
            op1='-';
            flag=1;
        }
        if(k==op['+'])
        {
            op1='+';
            flag=1;
        }
        if(!flag)
            return 1;
        if (op1=='+'|| op1 == '-')
            if (op2 == '*' || op2 == '/')
                return -1;
            else
                return 0;
    
        if (op1 == '*' || op1 == '/')
            if (op2 == '+' || op2 == '-')
                return 1;
            else
                return 0;
    }
    int main()
    {
        op['+']=1234134112312;
        op['-']=134891293847;
        op['*']=32419823749123;
        op['/']=398124719834143;
        int t;
        cin>>t;
        char s[1000060];
        while(t--)
        {
            while(!sss.empty())
                sss.pop();
            scanf("%s",s);
            ll pre=0;
            int tot=0;
            int len=strlen(s);
            for(int i=0;i<len;i++)
            {
                if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/')
                {
                    pre=pre*10+s[i]-'0';
                }
                else
                {
                    sss.push(pre);
                    pre=0;
                    while(!sss.empty()&&check(sss.top(),s[i])>=0)
                    {
                        num[tot++]=sss.top();
                        sss.pop();
                    }
                    sss.push(op[s[i]]);
                }
            }
            if(pre!=0)
                sss.push(pre);
            while(!sss.empty())
            {
                num[tot++]=sss.top();
                sss.pop();
            }
    
            for(int i=0;i<tot;i++)
            {
                if(num[i]!=op['+']&&num[i]!=op['-']&&num[i]!=op['*']&&num[i]!=op['/'])
                {
                    sss.push(num[i]);
                }
                else
                {
                    ll b=sss.top();
                    sss.pop();
                    ll a=sss.top();
                    sss.pop();
                    if(num[i]==op['+'])
                        sss.push(a+b);
                    else if(num[i]==op['-'])
                        sss.push(a-b);
                    else if(num[i]==op['*'])
                        sss.push(a*b);
                    else
                        sss.push(a/b);
                }
            }
            printf("%lld
    ",sss.top());
            sss.kiss=0;
        }
    }
  • 相关阅读:
    JAVA标签
    ORCLE报错解决(ora-01747:无效的用户.表.列,表.列)
    bug:执行到数据库连接后停止运行,而且不报错的奇怪情况----可能是多方同时访问造成的
    ora-01747:因为表中存在关键字造成的
    The servlets named [create_subscription] and [servlet.create] are both mapped to the url-pattern [/create] which is not permitted [duplicate]
    tomcat主页打不开,tomcat manager 配置,Failed to start component [StandardEngine[Catalina].
    web工程中文字符乱码:try { res.setContentType("text/html;charset=gbk"); PrintWriter pw=res.getWriter(); ;;; }
    bug: 1.eclipse 中tomcat server 变灰色 2.build path 添加的jar不识别
    转:不用安装Oracle客户端,远程连接Oracle数据库
    Android基础控件TextClock和Chronometer的使用
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4427322.html
Copyright © 2011-2022 走看看