Computer >> Máy Tính >  >> Lập trình >> C ++

Số nguyên tử trong C ++

Giả sử chúng ta có một công thức hóa học; chúng ta phải tìm số lượng của mỗi nguyên tử.

Một phần tử nguyên tử sẽ luôn bắt đầu bằng một ký tự viết hoa, có thể có không hoặc nhiều ký tự viết thường, đại diện cho tên. Và 1 hoặc nhiều chữ số đại diện cho số lượng của phần tử đó có thể theo sau nếu số lượng lớn hơn 1. Nhưng nếu số lượng là 1, không có chữ số nào theo sau. Ví dụ:H2O và H2O2 đều hợp lệ, nhưng H1O2 không hợp lệ.

Vì vậy, nếu đầu vào là Na2 (CO) 3, thì đầu ra sẽ là C3Na2O3, vì vậy điều này cho thấy 3 Carbon (C), 2 Natri (Na), 3 Oxy (O).

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm makeRet (), điều này sẽ chiếm một bản đồ m,

  • ret:=chuỗi trống

  • cho mỗi cặp khóa-giá trị 'it' trong m -

    • ret:=ret + key của nó

    • nếu giá trị của nó> 1, thì -

      • ret:=ret + giá trị của nó dưới dạng chuỗi

  • trả lại ret

  • Xác định một hàm countOfAtoms (), điều này sẽ mất s,

  • Xác định một bản đồ m

  • Xác định một ngăn xếp

  • i:=0, n:=kích thước của s

  • trong khi tôi

    • c:=s [i]

    • (tăng i lên 1)

    • nếu c giống với '(', thì -

      • chèn m vào st

      • m:=Xác định một bản đồ

    • ngược lại khi c giống với ')' thì -

      • val:=0

      • while (i

        • val:=val * 10 + (s [i] - ASCII của '0')

        • (tăng i lên 1)

      • Xác định một bản đồ temp:=phần tử hàng đầu của st

      • xóa phần tử khỏi st

      • cho mỗi cặp khóa-giá trị 'it' trong m -

        • value of it:=value of it * val

        • temp [key of it]:=temp [key of it] + value of it

      • m:=temp

    • Nếu không

      • name:=chuỗi trống

      • val:=0

      • name:=name + c

      • while (i

        • name:=name + s [i]

        • (tăng i lên 1)

      • while (i

        • val:=val * 10 + (s [i] - ASCII của '0')

        • (tăng i lên 1)

      • val:=(nếu val giống 0 thì 1, nếu không val)

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

  • trả về makeRet (m)

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#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"));
}

Đầu vào

Na2(CO)3

Đầu ra

C3Na2O3