[栈递归] LeetCode 726. 原子的数量

本文介绍了一种使用C++的map和stack数据结构来解析化学公式并计算各原子数量的方法。通过递归处理括号,实现了化学式的正确解析,并按字典序输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给出化学式,计算化学式中所有出现原子以及原子个数,字典序升序输出
一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。

思路

看到括号典型的递归,用栈写递归更加方便一点。
顺便可以学习一下C++ map和stack的用法
map的特性:

  1. key值不能重复,如果是数字或者string char等会自动排序非常适用这道题
  2. log级复杂的增删改以及搜索
  3. 可以直接用数组方式进行检索并对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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值