描述 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; }