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("\n");
}
*/
//**************************************************************************************


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\n",sss.top());
        sss.kiss=0;
    }
}

 

posted @ 2015-04-14 23:38  qscqesze  阅读(329)  评论(0编辑  收藏  举报