CSP/信奥赛C++刷题训练:经典例题 - 栈(2):洛谷P1981 :[NOIP2013 普及组] 表达式求值
题目背景
NOIP2013 普及组 T2
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 +
和乘法运算符 *
,且没有括号,所有参与运算的数字均为
0
0
0 到
2
31
−
1
2^{31}-1
231−1 之间的整数。
输入数据保证这一行只有 0123456789+*
这
12
12
12 种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 4 4 4 位时,请只输出最后 $ 4$ 位,前导 $ 0$ 不输出。
样例 #1
样例输入 #1
1+1*3+4
样例输出 #1
8
样例 #2
样例输入 #2
1+1234567890*1
样例输出 #2
7891
样例 #3
样例输入 #3
1+1000000003*1
样例输出 #3
4
提示
对于 30 % 30\% 30% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100 ≤100 ≤100。
对于 80 % 80\% 80% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 1000 ≤1000 ≤1000。
对于 100 % 100\% 100% 的数据, 0 ≤ 0≤ 0≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100000 ≤100000 ≤100000。
AC代码
#include<bits/stdc++.h>
using namespace std;
stack<int> s;
int a,b,ans;
char c;
int main(){
cin>>a;
a%=10000;
s.push(a);
while(cin>>c>>b){
if(c=='*'){
int tmp=s.top();
s.pop();
s.push(tmp*b%10000);
}else{
s.push(b);
}
}
ans=0;
while(s.size()){
ans+=s.top();
ans%=10000;
s.pop();
}
cout<<ans<<endl;
return 0;
}
文末彩蛋:
点击王老师青少年编程主页有更多精彩内容