Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में रासायनिक सूत्र में परमाणुओं की गणना (Number of Atoms)


समस्या विवरण

हमें एक रासायनिक सूत्र (chemical formula) दिया गया है; हमें प्रत्येक परमाणु की संख्या ज्ञात करनी है।

एक परमाणु तत्व हमेशा एक अपरकेस अक्षर से शुरू होता है, उसके बाद शून्य या अधिक लोअरकेस अक्षर हो सकते हैं (नाम के लिए)। उसके बाद 1 या अधिक अंक (count के लिए) आ सकते हैं यदि गिनती 1 से अधिक है। यदि गिनती 1 है, तो कोई अंक नहीं आता। उदाहरण: H2O और H2O2 वैध हैं, लेकिन H1O2 अवैध है।

उदाहरण

इनपुट

Na2(CO)3

आउटपुट

C3Na2O3

व्याख्या

यह दर्शाता है: 3 कार्बन (C), 2 सोडियम (Na), 3 ऑक्सीजन (O)।

समाधान दृष्टिकोण (स्टैक + मैप)

  1. स्ट्रिंग को बाएं से दाएं पार्स करें।
  2. '(' मिलने पर: वर्तमान मैप को स्टैक में पुश करें, नया खाली मैप शुरू करें।
  3. ')' मिलने पर: स्टैक से पिछला मैप पॉप करें, वर्तमान मैप के सभी गिनतियों को ब्रैकेट के बाद आने वाली संख्या से गुणा करें, और पिछले मैप में मर्ज करें।
  4. परमाणु नाम मिलने पर: नाम पढ़ें (अपरकेस + लोअरकेस), फिर संख्या पढ़ें (डिफ़ॉल्ट 1), वर्तमान मैप में जोड़ें।
  5. अंत में मैप को क्रमबद्ध क्रम में स्ट्रिंग में बदलें।

कार्यकारी प्रोग्राम

#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++];
            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 = ""; name += c;
                while (i < n && s[i] >= 'a' && s[i] <= 'z') {
                    name += s[i++];
                }
                int val = 0;
                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);
    }
};

int main() {
    Solution ob;
    cout << ob.countOfAtoms("Na2(CO)3");
    return 0;
}

आउटपुट

C3Na2O3
  1. - C++ में मितव्ययी संख्या (Frugal Number)

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया गया है। हमारा कार्य यह जांचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या (FRUGAL NUMBER) − एक संख्या जिसके अंकों की संख्या उस संख्या के अभाज्य गुणनखंडन में अंकों की संख्या से सख्ती से अधिक है। उदाहरण &

  1. C++ में पेंटाटोप संख्या C++ में पेंटाटोप संख्या

    एक पेंटाटोप संख्या को पास्कल के त्रिभुज में पांचवीं संख्या के रूप में वर्णित किया गया है। अब, चूंकि यह पांचवीं संख्या है, इसका मतलब है कि पास्कल के त्रिभुज में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है जो पास्कल के त्रिभुज की चौथी पंक्ति है। तो, इस

  1. - C++ में एडम नंबर जांचना

    इस खंड में हम देखेंगे कि दी गई संख्या एडम नंबर है या नहीं, इसकी जांच करने वाला प्रोग्राम कैसे लिखें। कोड में जाने से पहले देखते हैं कि एडम नंबर क्या है? एडम नंबर वह संख्या है, मान लीजिए n, यदि n का वर्ग और n के रिवर्स का वर्ग एक-दूसरे के रिवर्स हैं, तो वह संख्या एडम नंबर है। उदाहरण के लिए संख्या 13