题目传送门
题目:
题目描述
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
输入格式
一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “+” 和乘法运算符 “×”,且没有括号,所有参与运算的数字均为 0 到 2^31之间的整数。
输入数据保证这一行只有 0∼9、+、× 这 12种字符。
输出格式
一个整数,表示这个表达式的值。
注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。
输入输出样例
输入 #1
1+1*3+4
输出 #1
8
输入 #2
1+1234567890*1
输出 #2
7891
输入 #3
1+1000000003*1
输出 #3
4
说明/提示
对于 30%30% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100。
对于 80%80% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000。
对于 100%100% 的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000。
解题
我们该如何去解这道题呢?
可以用stack(栈)解
举个例子吧
就来计算1+2*3
准备两个栈,分别存储数字和运算符
我拿两种颜色来表示,红色代表数字栈,蓝色代表运算符栈
第一步
压栈,分别把数字和运算符压入栈中
第二步
出栈,将两个数字和一个运算符弹出,并作运算
第三步
将运算的结果压入栈中
第四步
重复第二步
第五步
栈空了,循环结束
发现
对于任何表达式,开头永远都是数字
可以单独输入第一个数字,把它压入栈
然后循环读入运算符和数字,如果运算符是*,则弹出栈顶元素,入栈栈顶元素*输入的新元素,若运算符是+,则入栈新元素
最后别忘了:累加器+=栈里的全部数字
按照这个步骤模拟即可推出代码!
代码
AC代码:
#include <bits/stdc++.h>
using namespace std;
//fgets!!
int n,m,ans;
char c;
int main()
{
cin >> n;
while(~scanf("%c%d",&c,&m))
{
if(c == '+') ans += n,n = m;
else if(c == '*') n *= m;
ans %= 10000;
n %= 10000;
}
cout << (ans + n) % 10000;
}
上面的注释只是个人习惯,删去不影响代码运行哦~
撒花