• 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
    ",ans+num.top());
        }
        return 0;
    }
  • 相关阅读:
    windows系统Redis客户端连接远程服务器
    Linux安装JDK1.8示例
    Nexus OrientDB数据库变为只读 storage is switched to 'read only' mode
    在SQL中有时候我们需要查看现在正在SQL Server执行的命令
    注册asp.net 到 iis时出错中的一种的 解决办法
    python 装饰器
    python 类调用实例的方法
    linux 命令大全
    python多态
    python扩展字典的功能
  • 原文地址:https://www.cnblogs.com/jhz033/p/5675991.html
Copyright © 2020-2023  润新知