C ++中的原子数
假设我们有一个化学式;我们必须找到每个原子的数量。
原子元素将始终以大写字符开头,可以有零个或多个小写字母表示名称。如果计数大于1,则可以跟随1或多个表示该元素计数的数字。但是,如果计数为1,则不跟随数字。例如,H2O和H2O2均有效,但H1O2无效。
因此,如果输入类似于Na2(CO)3,则输出将为C3Na2O3,因此这表示3个碳(C),2个钠(Na),3个氧(O)。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数makeRet(),这将占用一张映射m,
ret:=空字符串
对于m中的每个键值对“it”-
ret:=ret+它的值作为字符串
ret:=ret+键
如果它的值>1,则-
返回ret
定义一个函数countOfAtoms(),需要s,
定义一张映射
定义一个堆栈st
i:=0,n:=s的大小
当我<n时,-
名称:=空字符串
值:=0
名称:=名称+c
而(i<n和s[i]在范围“a”至“z”中)执行-
而(i<n和s[i]在0到9的范围内),则执行-
val:=(如果val与0相同,则为1,否则为val)
m[name]:=m[name]+val
名称:=名称+s[i]
(将i增加1)
val:=val*10+(s[i]-ASCII'0')
(将i增加1)
值:=0
而(i<n和s[i]在0到9的范围内),则执行-
定义一个maptemp:=st的top元素
从st删除元素
对于m中的每个键值对“it”-
m:=温度
val:=val*10+(s[i]-ASCII'0')
(将i增加1)
它的值:=它的值*val
temp[它的键]:=temp[它的键]+它的值
将m插入st
m:=定义一张映射
c:=s[i]
(将i增加1)
如果c与'('相同,则-
否则,当c与')'相同时,则-
除此以外
返回makeRet(m)
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string makeRet(map<string, int> m){
      string ret = "";
      for (auto& it : m) {
         ret += it.first;
         if (it.second > 1) {
            ret += to_string(it.second);
         }
      }
      return ret;
   }
   string countOfAtoms(string s){
      map<string, int> m;
      stack<map<string, int> > st;
      int i = 0;
      int n = s.size();
      while (i < n) {
         char c = s[i];
         i++;
         if (c == '(') {
            st.push(m);
            m = map<string, int>();
         }
         else if (c == ')') {
            int val = 0;
            while (i < n && s[i] >= '0' && s[i] <= '9') {
               val = val * 10 + (s[i] - '0');
               i++;
            }
            map<string, int> temp = st.top();
            st.pop();
            for (auto& it : m) {
               it.second *= val;
               temp[it.first] += it.second;
            }
            m = temp;
         }  
         else {
            string name = "";
            int val = 0;
            name += c;
            while (i < n && s[i] >= 'a' && s[i] <= 'z') {
               name += s[i];
               i++;
            }
            while (i < n && s[i] >= '0' && s[i] <= '9') {
               val = val * 10 + (s[i] - '0');
               i++;
            }
            val = val == 0 ? 1 : val;
            m[name] += val;
         }
      }
      return makeRet(m);
   }
};
main(){
   Solution ob;
   cout << (ob.countOfAtoms("Na2(CO)3"));
}输入值
Na2(CO)3
输出结果
C3Na2O3