zoukankan      html  css  js  c++  java
  • p1150[noip2013普及]表达式求值

    描述 Description
    给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。


    输入格式 Input Format
    输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为0到2^31-1之间的整数。输入数据保证这一行只有0~9、+、*这12种字符


    输出格式 Output Format
    输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。

    样例输入 Sample Input

    1+1*3+4


    样例输出 SampleOutput 


    8


    时间限制 Time Limitation
    1s


    注释 Hint
    【样例输入2】

    1+1234567890*1


    【样例输出2】

    7891
    【样例输入3】

    1+1000000003*1
    【样例输出3】

    4
    【样例解释】

      样例1计算的结果为8,直接输出8。
      样例2计算的结果为1234567891,输出后4位,即7891。
      样例3计算的结果为1000000004,输出后4位,即4。
    【数据规模】

    对于30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
    对于80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
    对于100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

    这道题一看数据用普通的模拟肯定会超时,有因为只有+和*这两种操作,所以直接用栈就可以

    如果当前符号是+号,那么就把这个数存入栈中,如果当前符号是*号,则将当前的数和栈顶相乘在放入栈中

    最后直接扫描一遍让栈中的所有元素相加即可

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct haha//用结构体记录符号和数字的值
    {
        long long v;
        char z;
    }a[101000];
    int num[101000],top=0;
    inline void push(int a)
    {
        num[++top]=a;
    }
    inline void pop()
    {
        top--;
    }
    inline int Top()
    {
        return num[top];
    }
    bool empty()
    {
        return top<1;
    }
    int main()
    {
        string s;
        cin>>s;
        int len=s.size();
        len++;
        s[len]='A';//因为最后一个数字后面没有符号,所以要随便添加一个字符,不然这样读不进去
        int h=0;
        int l=1;
        for(int i=0;i<len;i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                h=h*10+s[i]-'0';//计算当前数字的大小
            }
            else
            {
                a[l++].v=h;
                a[l].z=s[i];
                h=0;
            }
        }
        for(int i=1;i<=l;i++)
        {
            if(a[i].z!='*')//如果符号不是*号,则这个数进队,因为第一个元素前没有符号,所以不能直接写为if(a[i].z=='+')这样会使第一个元素无法进栈
                push(a[i].v);
            else//如果是*号
            {
                int v=Top();//取栈顶的元素
                pop();
                push((a[i].v*v)%10000);//将乘完的元素在放进去
            }
        }
        int ans=0;
        while(!empty())
        {
            ans+=Top();
            pop();
        }
        cout<<ans%10000<<endl;
        return 0;
    }
    boom(AC代码)
  • 相关阅读:
    C# TCP/IP 服务端 和 客户端
    (trigger)触发器的定义和作用
    AD账号登陆验证
    DES加密&解密字符串
    机器视觉(工业视觉)需要什么技能
    机器视觉对位贴合
    Halcon blob分析基本处理步骤
    cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考
    50道SQL练习题及答案与详细分析(MySQL)
    MySQL8.0 ROW_NUMBER、RANK、DENSE_RANK窗口函数 分组排序排名
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/6641379.html
Copyright © 2011-2022 走看看