(1)题目描述
(2)算法思想
- 将方程式以等号为界划分为前件与后件
- 以加号为分隔符得到前件与后件的单个化学式
- 得到化学式系数与化学式本身
- 处理化学式括号,对元素进行计数
- 比较前后件元素种类以及个数,种类不同直接输出“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