一、题目描述
下面我们针对每个测试点进行讲解,应该怎么处理各种情况
(1)只包含大写字母和等号
这一步我们只需要统计好每个大写字母的个数即可,但是这里要注意可能会出现重复的大写字母,例如:AAAA=AAAB
(2)加入小写字母和加号
这一步我们要针对每个化学式进行处理,同时我们要注意有的元素是同时包含了大小写字母,在处理的时候要把这些合在一起构成一个元素。
(3)加入数字
这一步就要判断数字的情况了,数字如果位于化学式的前面,则代表这个化学式的系数,意味着里面每一个元素都要乘以这个系数;如果数字位于这个元素的后面,则只需要这个元素乘以这个数字就行;如果数字位于一对括号的后面,则需要把这个括号里面的所有元素都乘以这个系数。
(4)加入括号
这一步我们可以进行倒序遍历,去挨个计算每一个括号内的元素,这里要注意的是括号嵌套的情况,具体的实现方法在下面的代码都有详细注释,方便大家理解。
三、代码实现#include
#include
#include
#include
#include
using namespace std;
//结构体,便于存储每一个化学式中的每一个元素
struct Elem{
string name;//元素名称
int num;//元素个数
//构造函数,便于直接赋值,注意最后没有分号
Elem(string n1,int n2):name(n1),num(n2){}
};
//便于获取系数和化学式下标
int number(string &str,int &i)
{
int num = 0;
while(isdigit(str[i]))
{
num = num * 10 + str[i] - '0';
i++;
}
return num;
}
//分别处理化学方程式等号两边
void calculate(string &str,map &mp)
{
stringstream ss(str);
string item;
//以加号为标志分割方程式,处理每一个化学式
while(getline(ss,item,'+'))
{
int factor = 1;//化学式初始系数,默认为1
int i = 0;
vector elem;
//如果化学式前面的系数不为0,则进行计算,赋值给factor
if(isdigit(item[i])) factor = number(item,i);
//开始处理每个化学式
while(isecond) return false;
}
return true;
}
int main()
{
int n;
cin>>n;
string str,str_left,str_right;
while(n--)
{
cin>>str;
stringstream ss(str);
getline(ss,str_left,'=');//赋值化学方程式等号左边
getline(ss,str_right);//赋值化学方程式等号右边
map left,right;
calculate(str_left,left);//处理化学方程式的左半部分
calculate(str_right,right);//处理化学方程式的右半部分
if(judge(left,right)) cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?