描述 Description
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。 输入格式 Input Format 输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“*”,且没有括号,所有参与运算的数字均为0到2^31-1之间的整数。输入数据保证这一行只有0~9、+、*这12种字符。
输出格式 Output Format 输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。样例输入 Sample Input
1+1*3+4 样例输出 SampleOutput8
时间限制 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#include #include #include #include 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 ='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< <