Advertisement
Derga

Untitled

Oct 24th, 2023 (edited)
658
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <forward_list>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class MyStack {
  9. private:
  10.     std::forward_list<string> my_stack;
  11. public:
  12.     void Push(string number) {
  13.         my_stack.push_front(number);
  14.     }
  15.     string Top() {
  16.         return my_stack.front();
  17.     }
  18.     void Pop() {
  19.         my_stack.pop_front();
  20.     }
  21.     bool Empty() {
  22.         return my_stack.empty();
  23.     }
  24. };
  25.  
  26. int GetNumber(const string& str, int& idx) {
  27.     int number = 0;
  28.     while (idx < str.size() && '0' <= str[idx] && str[idx] <= '9') {
  29.         number *= 10;
  30.         number += (str[idx] - '0');
  31.         idx++;
  32.     }
  33.     return number;
  34. }
  35.  
  36. vector<int> ParseFormulaPart(const string& formula_part) {
  37.     vector<int> statistics(26, 0);
  38.     int i = 0;
  39.     while (i < formula_part.size()) {
  40.         if ('A' <= formula_part[i] && formula_part[i] <= 'Z') {
  41.             char element = formula_part[i];
  42.             i++;
  43.             int count = GetNumber(formula_part, i);
  44.             if (count == 0) {
  45.                 count = 1;
  46.             }
  47.             statistics[element - 'A'] += count;
  48.         }
  49.     }
  50.     return statistics;
  51. }
  52.  
  53. int main() {
  54.     string formula;
  55.     cin >> formula;
  56.     MyStack formula_parts;
  57.     string formula_part;
  58.     vector<int> result(26, 0);
  59.  
  60.     int i = 0;
  61.     while (i < formula.size()) {
  62.         if (formula[i] == '(') {
  63.             i++;
  64.             formula_parts.Push(formula_part);
  65.             formula_part.clear();
  66.             continue;
  67.         }
  68.        
  69.         if (formula[i] == ')') {
  70.             i++;
  71.             int multiplier = GetNumber(formula, i);
  72.             if (multiplier == 0) {
  73.                 multiplier = 1;
  74.             }
  75.            
  76.             vector<int> statistics = ParseFormulaPart(formula_part);
  77.            
  78.             for (int i = 0; i < 26; ++i) {
  79.                 result[i] += statistics[i];
  80.                 result[i] *= multiplier;
  81.             }
  82.            
  83.             if (!formula_parts.Empty()) {
  84.                 formula_part = formula_parts.Top();
  85.                 formula_parts.Pop();
  86.             }
  87.             continue;
  88.         }
  89.  
  90.         formula_part += formula[i];
  91.         i++;
  92.     }
  93.  
  94.     int multiplier = GetNumber(formula, i);
  95.     if (multiplier == 0) {
  96.         multiplier = 1;
  97.     }
  98.     vector<int> v = ParseFormulaPart(formula_part);
  99.  
  100.     for (int i = 0; i < 26; ++i) {
  101.         result[i] += v[i];
  102.         result[i] *= multiplier;
  103.     }
  104.    
  105.     for (int i = 0; i < result.size(); ++i) {
  106.         if (result[i]) {
  107.             cout << (char)('A' + i);
  108.             if (result[i] > 1) {
  109.                 cout << result[i];
  110.             }
  111.         }
  112.     }
  113. }
  114.  
  115. /*
  116. test1
  117. H4ZO2
  118. H4O2Z
  119.  
  120. test2
  121. N(OY3)2
  122. NO2Y6
  123.  
  124. test3
  125. Z3(O(N2O3)2)3
  126. N12O21Z3
  127.  
  128. test4
  129. ZZZ
  130. Z3
  131.  
  132. test5
  133. (ZZZ)
  134. Z3
  135.  
  136. test6
  137. (((ZZZ)Z)Z)Z
  138. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement