主要是注意对符号的读取和数字的处理,对于括号的嵌套处理效仿符号运算的方法,利用栈stack来解决,这道题只有90分,实在找不到错的地方了,可能是考虑字符位置关系漏了一些情况。以后对于序列的字符处理,可以在处理这一位的时候直接查看前后位的情况来判断该怎么做,我这次就是仅考虑当前位和上一位(stack.top()),忘记直接看序列的后一位,所以在中间的处理过程情况就会显得有点乱,不好理清,记录一下代码。
//1912化学方程式
#include<bits/stdc++.h>
using namespace std;
map<string, int> l;
map<string, int> r;
// 判断左右元素是否配平
bool eq(map<string, int> &l, map<string, int> &r) {
if(l.size()!=r.size()) return 0;
for(auto it:l) {
if(r.find(it.first)==r.end()) return 0;
auto t = r.find(it.first);
if(it.second!=t->second) return 0;
}
return 1;
}
// 处理字符串统计
void cal_substr(string &str, map<string, int> &m) {
vector<string> sub;
while(str.find("+")!=str.npos) {
int pos = str.find("+");
sub.push_back(str.substr(0, pos));
str = str.substr(pos+1);
}
sub.push_back(str);
stack<pair<string, int> > temp;
// 处理单个化学式
for(auto &it:sub) {
int k=1;
// 可能是多位数
if(it[0]>='0'&&it[0]<='9') {
k = it[0]-'0';
it = it.substr(1);
}
while(it[0]>='0'&&it[0]<='9') {
k *= 10;
k += it[0]-'0';
it = it.substr(1);
}
// cout << "k:" << k <<endl;
// 读取字符--单独的字符char
for(auto e=it.begin(); e!=it.end(); e++) {
if(*e>='A'&&*e<='Z') {
// 判断前面是不是")"好删除一对括号
if(!temp.empty()&&temp.top().first==")") {
vector<pair<string, int> > tt;
temp.pop();
while(temp.top().first!="(") {
pair<string, int> st = temp.top(); temp.pop();
tt.push_back(st);
}
temp.pop();
for(auto &ttt:tt) {
temp.push(ttt);
}
}
string st; st.push_back(*e); temp.push({st, 1});
}
else if(*e>='a'&&*e<='z') {
pair<string, int> st = temp.top(); temp.pop();
st.first.push_back(*e); temp.push(st);
}
else if(*e=='(') {
// 判断前面是不是")"好删除一对括号
if(!temp.empty()&&temp.top().first==")") {
vector<pair<string, int> > tt;
temp.pop();
while(temp.top().first!="(") {
pair<string, int> st = temp.top(); temp.pop();
tt.push_back(st);
}
temp.pop();
for(auto &ttt:tt) {
temp.push(ttt);
}
}
string st; st.push_back(*e); temp.push({st, 1});
}
else if(*e==')') {
string st; st.push_back(*e); temp.push({st, 1});
}
else if(*e>='0'&&*e<='9') {
// 判断后面还是否有数字
int kk = *e-'0';
auto p = e+1;
while(*p>='0'&&*p<='9') {
kk *= 10;
kk += *p-'0';
p++; e++;
}
// cout << "kk:" << kk <<endl;
// 数字为k, 分析栈中情况
if(temp.top().first==")") {
vector<pair<string, int> > tt;
temp.pop();
while(temp.top().first!="(") {
pair<string, int> elem = temp.top(); temp.pop();
elem.second *= kk;
tt.push_back(elem);
}
temp.pop(); // 移除(
// 将元素放入栈中
for(auto &ttt:tt) {
temp.push(ttt);
}
}
else { // 前面就是元素
pair<string, int> elem = temp.top(); temp.pop();
elem.second *= kk;
temp.push(elem);
}
}
}
// 判断最后是否是")"
if(!temp.empty()&&temp.top().first==")") {
vector<pair<string, int> > tt;
temp.pop();
while(temp.top().first!="(") {
pair<string, int> st = temp.top(); temp.pop();
tt.push_back(st);
}
temp.pop();
for(auto &ttt:tt) {
temp.push(ttt);
}
}
// 将栈中元素加入到m中
while(!temp.empty()) {
pair<string, int> elem = temp.top(); temp.pop();
if(m.find(elem.first)==m.end()) {
m.insert({elem.first, elem.second*k});
}
else {
m[elem.first] += elem.second*k;
}
}
}
return;
}
int main() {
int n;
cin >> n;
string s;
while(n--) {
cin >> s;
int pos = s.find("=");
string lstr = s.substr(0, pos);
string rstr = s.substr(pos+1);
l.clear();
r.clear();
cal_substr(lstr, l);
cal_substr(rstr, r);
// for(auto it:l) {
// cout << it.first <<"---" << it.second << endl;
// }
if(eq(l, r)) {
cout << "Y" <<endl;
}
else {
cout << "N" <<endl;
}
}
return 0;
}