2013NOIP普及组真题 2. 表达式求值

线上OJ:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1962

核心思想:(模拟)

本题的符号只有 + + + ∗ * ,没有括号,没有表达式的合法性判断,所以逻辑上不复杂。只需要 将读入的乘法先行计算,最后统一做加法 即可。故可以采用 模拟 的方法,一边读入数据,一边处理

第一步

读入一个符号和一个数字。( 举例:15+22*36+49,则读入的分别是 +22 或者 *36 或者 +49 )

第二步

如果该数字前面是乘号,则把上一个数字取出来先乘,然后仅把积入栈(如上式中的22*36=792,将792入数字栈);如果该数字前面是➕,直接将数字入栈

第三步

由于乘法在入栈前已经处理完,故栈内的数字依次相加即可

题解代码:
#include <bits/stdc++.h>
#define ll long long
#define MOD 10000
using namespace std;

stack <ll> num_stk; // 存储数字

int main()
{
	ll x, y, ans = 0;
	char s;
	cin >> x; // 由于本题的输入中没有空格,所以可以直接cin取数。第一个数先单独取,后续每次读入“符号和数字”,
	num_stk.push( x % MOD );//压入栈中.由于数可能很大,每个数在运算前后都取模

	// 一边读入数据,以便先把乘法都计算了
	while(cin >> s >> y)
	{
		if(s == '*')  // 如果当前读入的时乘号,则把数字栈顶的元素取出,与y相乘。然后积入栈
		{
		    ll tmp = num_stk.top();
			num_stk.pop();
			num_stk.push( (tmp * (y % MOD)) % MOD );
		}
		else  num_stk.push( y % MOD ); // 如果读入的是加号,则直接数值入数字栈
	}
    // 当上一个while循环结束后,此时仅剩加法。数字栈的数字依次相加即可
    while(!num_stk.empty())
	{
		ans = (ans + num_stk.top()) % MOD;
        num_stk.pop();
	}

	cout << ans << endl;
	return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值