QLU第三次测试赛-表达式求值

这篇博客介绍了QLU第三次测试赛中的一个关于计算只包含加法和乘法的算术表达式的问题。博主分享了两种解题思路:大模拟和利用C++的cin功能边读边计算。尽管大模拟方法在考场上让博主感到困难,但最终通过振原哥的题解理解了字符串处理方法,成功解决问题。这是一个相对简单的题目,适合初学者练习。

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘 法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31 -1 之间的整数。
输入数据保 证这一行只有 0~ 9、+、*这 12 种字符。

输出
输出只有一行,包含一个整数,表示这个表达式的值。
注意:当答案长度多于 4 位时, 请只输出最后 4 位,前导 0 不输出。

样例输入

1+1*3+4

样例输出

8

提示
样例 计算的结果为 8,直接输出 8。

【数据范围】
对于 30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于 80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于 100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

提示的一点:关于模运算

(a+b)%p == (a%p + b%p)%p

(a*b)%p == (a%p * b%p)%p

解题思路1.

大模拟:把整一行的表达式看作一串字符串,然后通过读取每一个字符做相应处理,遇到“+”该怎么做,以及遇到“*”该怎么做,以及遇到数字或许要把字符按10进制转化为数字…

考场上的我此题大模拟,调试很久出不来,并不明白错在哪,况且码了100行,头疼–>放弃 幸好此题振原哥顺利轻松的用字符串做法做了出来,我们思路一样就是我没做出来呗(逃…

振原哥题解----->题解

解法2

我突然想起c++ “cin”功能十分强大,以至于…废话不多说 ,直接上代码,(边读边算,读完也就算完了

#include<iostream></
1、先读入一行表达式,用一个字符数组line[]存储 2、依次读入每个字符并进行处理同是进行表达式判错: 1. 遇数字,则继续判断下一个字符,直到下一个字符不是数字且不是小数点,若该数含有两个小以上数点,则表示输入错误。否则即可保证该操作数是完整的浮点数,然后将该数入操作数栈。 若数字不是表达式的最后一位,且数字后面跟的不是“+、-、*、/、^、)”,则为表达式错误 2. 遇运算符,则分两种情况: 1、若运算符为负号(该运算符为符号的情况有两种:一为负号在最开头,一为符号前面是“(” ),则先将0入操作数栈,然后再将负号入运算符栈。 2、该运算符不是负号则与运算符栈的栈顶元素比: (1) 若栈顶元素优先级低, 新输入的运算符入栈。 (2) 若栈顶元素优先级高, 1) 从符号栈弹出一个运算符, 2) 从对象栈弹出一个/两个操作数, 3) 运算结果压入对象栈。 (3) 优先级相等,则栈顶元素出栈,与输入元素对消。 若“(、+、-、*、/、^”放在表达式最后面,则表达式错误 若“+、-、*、/、^”后面跟的不是数字或者变量,表达式错误 3、遇字母变量,则继续判断下一个字符,直到下一个字符不是字母变量,即可保证该变量是完整的,然后输出“请输入变量的值”,再将输入的变量值入操作数栈。 若变量后面跟的不是“+、-、*、/、^、)”,则表达式错误 4、若所读的该字符不是上述情况中的一种,则表达式错误 3、当将所有的字符都读一遍之后,若表达式正确的话,则必然不含有“(”或者“)”。即若运算符栈中含有“(”或者“)”,则表达式必错误。 再考虑表达式正确的情况:运算符栈可能为空,则操作符栈中必剩下一个操作数,即最后的结果。若不为空,则留在运算符栈中的运算符的优先级别从栈顶至栈底依次递减。故可从运算符栈顶开始弹出一个运算符,从操作数栈中弹出两个操作数进行运算,再将运算结果入操作数栈,一直循环至运算符栈为空。此时操作数栈剩下的唯一一个操作数就是运算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值