UESTC 1074 秋实大哥搞算数 栈模拟

秋实大哥搞算数

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

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

Input

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

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

保证输入合法。

Output

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

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

Sample input and output

Sample InputSample Output
2
12+5/4-1
4*5/3
12
6

思路:将数和符号分别放入两个栈内;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define esp 1e-10
const int N=1e5+10,M=1e6+10,mod=1e9+7,inf=1e9+10;
char a[M];
int main()
{
    ll x,y,z,i,t;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",a);
        stack<char>s;
        stack<ll>num;
        x=strlen(a);
        ll pos=0;
        ll n=0;
        for(pos=0;pos<x&&a[pos]>='0'&&a[pos]<='9';pos++)
        {
            n*=10;
            n+=a[pos]-'0';
        }
        num.push(n);
        while(pos<x)
        {
            s.push(a[pos++]);
            n=0;
            while(pos<x&&a[pos]>='0'&&a[pos]<='9')
            {
                n*=10;
                n+=a[pos]-'0';
                pos++;
            }
            if(s.top()=='*')
            {

                ll k=num.top();
                num.pop();
                num.push(n*k);
                s.pop();
            }
            else if(s.top()=='/')
            {
                ll k=num.top();
                num.pop();
                num.push(k/n);
                s.pop();
            }
            else
            num.push(n);
        }
        ll ans=0;
        while(!s.empty())
        {
            if(s.top()=='+')
            ans+=num.top();
            else if(s.top()=='-')
            ans-=num.top();
            num.pop();
            s.pop();
        }
        printf("%lld\n",ans+num.top());
    }
    return 0;
}

 

posted @ 2016-07-16 12:25  jhz033  阅读(240)  评论(0编辑  收藏  举报