CCF 201912-3化学方程式 (100分)

该博客介绍了一个处理化学方程式的算法,通过等号分隔前件和后件,加号分隔化学式,并用栈处理括号进行元素计数。如果元素种类和个数相等,则输出'Y',否则输出'N'。
摘要由CSDN通过智能技术生成

(1)题目描述

在这里插入图片描述

(2)算法思想

  1. 将方程式以等号为界划分为前件与后件
  2. 以加号为分隔符得到前件与后件的单个化学式
  3. 得到化学式系数与化学式本身
  4. 处理化学式括号,对元素进行计数
  5. 比较前后件元素种类以及个数,种类不同直接输出“N”,否则比较相应元素的个数,若全部相等则输出“Y”。

此处实现时的难点在于处理嵌套的括号,我此处采取的是使用栈进行括号匹配,每次得到括号后面的数字,元素下标乘以其即可。

(3)代码实现

#include<map>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
vector<string> preforms;
vector<string> nexforms;

struct node {
   
	int number;
	string form;
	node() {
   
		form="?";
		number=0;
	}
};

int mystoi(string s) {
   
	int number;
	stringstream ss;
	ss<<s;
	ss>>number;
	if(!isdigit(s[0]))
		number=1;
	return number;
}

string myitos(int n) {
   
	string s;
	stringstream ss;
	ss<<n;
	ss>>s;
	return s;
}

void divide(string s) {
   
	string lstr,rstr,temps;
	for(int i=0; i<s.size(); i++) {
   
		if(s[i]=='=')
			s[i]=' ';
	}
	istringstream ss(s);
	getline(ss,lstr,' ');
	getline(ss,rstr);
	for(int i=0; i<lstr.size(); i++) {
   
		if(lstr[i]=='+')
			lstr[i]=' ';
	}
	for(int i=0; i<rstr.size(); i++) {
   
		if(rstr[i]=='+')
			rstr[i]=' ';
	}
	istringstream lss(lstr);
	istringstream rss(rstr);
	while(getline(lss,temps,' '))
		preforms.push_back(temps);
	while(getline(rss,temps,' '))
		nexforms.push_back(temps);
}

void getform(string s, vector<node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值