作者:失意的汐_194 | 来源:互联网 | 2023-09-14 19:24
题目描述给出化学式,计算化学式中所有出现原子以及原子个数,字典序升序输出一个括号中的化学式和数字(可选择性添加)也是化学式。例如(H2O2)和(H2O2)3是化学式。思路看
题目描述
给出化学式,计算化学式中所有出现原子以及原子个数,字典序升序输出
一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。
思路
看到括号典型的递归,用栈写递归更加方便一点。
顺便可以学习一下C++ map和stack的用法
map的特性:
- key值不能重复,如果是数字或者string char等会自动排序非常适用这道题
- log级复杂的增删改以及搜索
- 可以直接用数组方式进行检索并对value值操作
具体思路:
非括号内的原子直接进入答案map
括号内原子进入栈,碰到右括号则括号内原子个数乘以相应数字,再放回栈
如果栈内没括号了那么栈内原子进入map
可以再写一个pair数组维护,将栈中元素弹出存入数组中,碰到栈中左括号停止,此时如果栈空,那么数组所有元素进入map,否则全部入栈
元素进入map不需要find,直接map[string]+=num即可
代码
bool isbig(char a){return a>='A'&&a<='Z';}bool issmall(char a){return a>='a'&&a<='z';}bool isnum(char a){return a>='0'&&a<='9';}int tonum(string a){if(a.length()==0)return 1;int res=0;for(int i=0;i<a.length();i++){res=res*10+a[i]-'0';}return res;}string countOfAtoms(string formula) {stack<pair<string,int>>q;stack<pair<string,int>>tmpstack;pair<string,int>tmppair;map<string,int>ans;int type=1,n=formula.length();string tmpstr="";string tmpnum="";for(int i=0;i<n;i++){char c=formula[i];if(isbig(c)){tmpstr+=c;i++;c=formula[i];while(issmall(c)&&i<n){tmpstr+=c;i++;c=formula[i];}while(isnum(c)&&i<n){tmpnum+=c;i++;c=formula[i];}if(type==1)ans[tmpstr]+=tonum(tmpnum);else q.push({tmpstr,tonum(tmpnum)});tmpstr.clear();tmpnum.clear();i--;}else if(c=='('){q.push({"",0});type=2;}else if(c==')'){i++;c=formula[i];while(isnum(c)&&i<n){tmpnum+=c;i++;c=formula[i];}int x=tonum(tmpnum);tmpnum.clear();while(!q.empty()){tmppair=q.top();q.pop();if(tmppair.second==0)break;tmpstack.push({tmppair.first,tmppair.second*x});}if(!q.empty()){while(!tmpstack.empty()){q.push(tmpstack.top());tmpstack.pop();}}else{while(!tmpstack.empty()){tmppair=tmpstack.top();tmpstack.pop();ans[tmppair.first]+=tmppair.second;}type=1;}i--;}}string res="";for(auto it:ans)if(it.second!=1)res=res+it.first+to_string(it.second);else res=res+it.first;return res;}