P2382 化学分子式

题目

模拟

1、遇到'(',我们就把栈的层数+1,以便出栈时累计

2、遇到字母后,判断下一位是否是小写字母,将其在map中的值取出加入栈中,再将最近一次的元素保存(暂记作key),等会有用^_^,别忘了判断UNKNOWN。

3、遇到数字,while循环取出它(记作x),说明上次的key有了用武之地,在栈中加入(x - 1)倍的key元素质量,因为上一次加了一份嘛

4、若遇到')',我们考虑直接取出后面的数字(还是x),然后将本层栈中答案乘上x,加入上一层栈中并清空这一层。

完结撒花!

#include<bits/stdc++.h>
using namespace std;
map<string,int> a;
string s,ss;
int x,top,b[100005];
int main() {
    cin>>s;
    while (s!="END_OF_FIRST_PART") {
        cin>>x;
        a[s]=x;
        cin>>s;
    }
    cin>>s;
    while (s!="0") {
        int fl=1;
        memset(b,0,sizeof(b));
        s=' '+s;
        top=0;
        for (int i=1; i<=s.length(); i++) {
            if (s[i]>='A' && s[i]<='Z') {
                if (s[i+1]>='a' && s[i+1]<='z') {
                    ss=s.substr(i,2);
                    i++;
                } else ss=s.substr(i,1);
                if (!a[ss]) {
                    printf("UNKNOWN
");
                    fl=0;
                    break;
                } else b[top]+=a[ss];
            }
            if (s[i]>='0' && s[i]<='9') {
                x=0;
                while (s[i]>='0' && s[i]<='9') {
                    x=x*10+s[i]-'0';
                    i++;
                }
                i--;
                b[top]+=(x-1)*a[ss];
            }
            if (s[i]=='(') top++;
            if (s[i]==')') {
                i++,x=0;
                while (s[i]>='0' && s[i]<='9') {
                    x=x*10+s[i]-'0';
                    i++;
                }
                b[--top]+=x*b[top+1];
                b[top+1]=0;
                i--;
            }
        }
        if (fl) printf("%d
",b[0]);
        cin>>s;

    }

    return 0;
}
原文地址:https://www.cnblogs.com/zzrblogs/p/12201861.html