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代码)

 

posted @ 2017-03-29 19:32  列車員lcy  阅读(387)  评论(0编辑  收藏  举报