Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 원자 수

<시간/>

화학식이 있다고 가정합니다. 각 원자의 개수를 찾아야 합니다.

원자적 요소는 항상 대문자로 시작하며 이름을 나타내는 0개 이상의 소문자가 있을 수 있습니다. 카운트가 1보다 크면 해당 요소의 카운트를 나타내는 1개 이상의 숫자가 뒤따를 수 있습니다. 그러나 카운트가 1이면 숫자가 뒤따르지 않습니다. 예를 들어 H2O와 H2O2는 모두 유효하지만 H1O2는 유효하지 않습니다.

따라서 입력이 Na2(CO)3와 같으면 출력은 C3Na2O3가 되므로 3 Carbon(C), 2 Sodium(Na), 3 Oxygen(O)을 나타냅니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • makeRet() 함수를 정의하면 하나의 맵 m이 필요합니다.

  • ret :=빈 문자열

  • m −

    의 각 키-값 쌍 'it'에 대해
    • ret :=ret + 그것의 키

    • 값> 1이면 -

      • ret :=ret + 문자열 값

  • 리턴 렛

  • countOfAtoms() 함수를 정의하면 s가 필요합니다.

  • 하나의 맵 정의

  • 하나의 스택 정의

  • i :=0, n :=s의 크기

  • 나는

    • c :=s[i]

    • (i를 1씩 증가)

    • c가 '('와 같으면 -

      • m을 st에 삽입

      • m :=하나의 맵 정의

    • 그렇지 않으면 c가 ')'와 같을 때 -

      • 값 :=0

      • 동안 (i

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

        • (i를 1씩 증가)

      • 하나의 맵 temp 정의 :=st의 최상위 요소

      • st

        에서 요소 삭제
      • m −

        의 각 키-값 쌍 'it'에 대해
        • 그것의 가치 :=그것의 가치 * val

        • temp[키] :=temp[키] + 값

      • m :=온도

    • 그렇지 않으면

      • 이름 :=빈 문자열

      • 값 :=0

      • 이름 :=이름 + c

      • 동안 (i

        • 이름 :=이름 + s[i]

        • (i를 1씩 증가)

      • 동안 (i

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

        • (i를 1씩 증가)

      • val :=(val이 0과 같으면 1, 그렇지 않으면 val)

      • m[이름] :=m[이름] + 발

  • 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