Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับจำนวนอะตอมใน C++


สมมติว่าเรามีสูตรเคมี เราต้องหาจำนวนอะตอมแต่ละชนิด

ธาตุเริ่มต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์เล็ก 0 ตัวขึ้นไป และตัวเลข 1 ตัวขึ้นไปแทนจำนวน (ถ้าเป็น 1 จะไม่เขียนตัวเลข) เช่น H2O และ H2O2 ถูกต้อง แต่ H1O2 ผิด

เช่น Na2(CO)3 เอาต์พุตคือ C3Na2O3 หมายถึง คาร์บอน 3 โซเดียม 2 ออกซิเจน 3

วิธีแก้ − ใช้ Stack จัดการวงเล็บ และ Map นับจำนวนอะตอม

ตัวอย่าง

#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, 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