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

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


สมมุติว่าเรามีสูตรเคมี เราต้องหาการนับของแต่ละอะตอม

องค์ประกอบอะตอมจะเริ่มต้นด้วยอักขระตัวพิมพ์ใหญ่เสมอ โดยอาจมีตัวอักษรตัวพิมพ์เล็กเป็นศูนย์หรือมากกว่านั้นแทนชื่อ และตัวเลข 1 ตัวขึ้นไปแทนการนับขององค์ประกอบนั้นอาจตามมาหากการนับมากกว่า 1 แต่ถ้านับเป็น 1 ตัวเลขจะไม่ตามมา ตัวอย่างเช่น H2O และ H2O2 ถูกต้อง แต่ H1O2 ไม่ถูกต้อง

ดังนั้น หากอินพุตเป็นเหมือน Na2(CO)3 เอาต์พุตจะเป็น C3Na2O3 ดังนั้น นี่จึงหมายถึง 3 คาร์บอน (C), 2 โซเดียม (Na), 3 ออกซิเจน (O)

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน makeRet() ซึ่งจะใช้เวลาหนึ่งแผนที่ m

  • ret :=สตริงว่าง

  • สำหรับแต่ละคู่คีย์-ค่า 'มัน' ในหน่วย m -

    • ret :=ret + คีย์ของมัน

    • ถ้าค่าของมัน> 1 แล้ว −

      • ret :=ret + ค่าของมันเป็นสตริง

  • รีเทิร์น

  • กำหนดฟังก์ชัน countOfAtoms() ซึ่งจะใช้เวลา s

  • กำหนดหนึ่งแผนที่ m

  • กำหนดหนึ่งสแต็ก st

  • ผม :=0, n :=ขนาดของ s

  • ในขณะที่ฉัน

    • c :=s[i]

    • (เพิ่ม i ขึ้น 1)

    • ถ้า c เหมือนกับ '(' แล้ว −

      • ใส่ m เข้าไปใน st

      • m :=กำหนดหนึ่งแผนที่

    • มิฉะนั้นเมื่อ c เหมือนกับ ')' แล้ว −

      • ค่า :=0

      • ในขณะที่ (i

        • val :=val * 10 + (s[i] - ASCII ของ '0')

        • (เพิ่ม i ขึ้น 1)

      • กำหนดหนึ่งอุณหภูมิแผนที่ :=องค์ประกอบด้านบนของ st

      • ลบองค์ประกอบออกจาก st

      • สำหรับแต่ละคู่คีย์-ค่า 'มัน' ในหน่วย m -

        • ค่าของมัน :=ค่าของมัน * val

        • temp[key of it] :=temp[key of it] + ค่าของมัน

      • m :=อุณหภูมิ

    • มิฉะนั้น

      • ชื่อ :=สตริงว่าง

      • ค่า :=0

      • ชื่อ :=ชื่อ + ค

      • ในขณะที่ (i

        • ชื่อ :=ชื่อ + s[i]

        • (เพิ่ม i ขึ้น 1)

      • ในขณะที่ (i

        • val :=val * 10 + (s[i] - ASCII ของ '0')

        • (เพิ่ม i ขึ้น 1)

      • val :=(ถ้า val เหมือนกับ 0, แล้ว 1 มิฉะนั้น val)

      • m[name] :=m[name] + val

  • ส่งคืน 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