201912-3 CCF CSP认证 化学方程式

题意:给一个化学方程式,验证是否配平。

做法:

         首先我们把等式两边的每一项带系数的化学式都分开,比如H2+O2=2H2O  先拆分成H2 、O2、2H2O

        上边拆好的我们再把系数分离出来,处理单个的化学式比如,2H2O拆分成2  、 H2O 处理H2O

        将刚刚拆出来的H2O,数据信息统计到cnt数组

1. 如果是元素后边直接跟着的数字,我们把这个数字直接给到元素的第一个字母   比如H2CO3 那么 cnt[0] = 2 ,cnt[2]=1,cnt[3] = 3

2. 如果是带括号的,比如(PO4)3那么 我们用一个栈来维护,4我们按上述步骤处理,这个括号外的3要给到“(”对应的位置。

统计好cnt数组后,我们就可以开始统计了,如果碰到的是左括号,那么要乘上相应的cnt,如果碰到的是右括号就要除以相应的cnt

代码:

#include
#define ll long long
using namespace std;
const ll MAXN = 1e5+5;
char a[MAXN];
mapmp1,mp2;
string s;
int cnt[505];
int len;
bool is_litte(char k){
    if(k>='a' && k<='z')return 1;
    else return 0;
}
bool is_big(char k){
    if(k>='A' && k<='Z')return 1;
    else return 0;
}
void jishu(string k){ // 计算cnt数组
    //cout<st;
    int idx=0,nb = 0;
    for(int i=0;i<=sz;i++){
        if(i==sz || is_big(k[i]) ||  k[i] == ')'){
            cnt[idx] = (nb==0)?1:nb;
            //cout<='a' && k[i+1]<='z'){
                i++;
            }
        }
        if(k[i] == '('){
            st.push(i);
            continue;
        }
        if(k[i] == ')'){
            int kk = st.top();
            st.pop();
            idx = kk;
            cnt[i] = kk;

        }
        if (k[i]>='0' && k[i]<='9'){
            nb = nb*10 +(k[i]-'0');
        }
    }
    for(int i=0;i='0' && k[i]<='9')
            xi = xi*10 + (k[i]-'0');
        else {
            idx = i;break;
        }
    }
    if(xi == 0)xi = 1;
    string hua2 = k.substr(idx,k.size()-idx);
    jishu(hua2);
    int sz = hua2.size();
    int now = 1;
    string kk = "";
    for(int i=0;i "< "<>t;
    while(t--){
        cin>>s;
        len = s.size();
        mp1.clear();
        mp2.clear();
        if(fun()){
            cout<<"Y"<

 

你可能感兴趣的:(201912-3 CCF CSP认证 化学方程式)