Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <forward_list>
- #include <string>
- #include <vector>
- using namespace std;
- class MyStack {
- private:
- std::forward_list<string> my_stack;
- public:
- void Push(string number) {
- my_stack.push_front(number);
- }
- string Top() {
- return my_stack.front();
- }
- void Pop() {
- my_stack.pop_front();
- }
- bool Empty() {
- return my_stack.empty();
- }
- };
- int GetNumber(const string& str, int& idx) {
- int number = 0;
- while (idx < str.size() && '0' <= str[idx] && str[idx] <= '9') {
- number *= 10;
- number += (str[idx] - '0');
- idx++;
- }
- return number;
- }
- vector<int> ParseFormulaPart(const string& formula_part) {
- vector<int> statistics(26, 0);
- int i = 0;
- while (i < formula_part.size()) {
- if ('A' <= formula_part[i] && formula_part[i] <= 'Z') {
- char element = formula_part[i];
- i++;
- int count = GetNumber(formula_part, i);
- if (count == 0) {
- count = 1;
- }
- statistics[element - 'A'] += count;
- }
- }
- return statistics;
- }
- int main() {
- string formula;
- cin >> formula;
- MyStack formula_parts;
- string formula_part;
- vector<int> result(26, 0);
- int i = 0;
- while (i < formula.size()) {
- if (formula[i] == '(') {
- i++;
- formula_parts.Push(formula_part);
- formula_part.clear();
- continue;
- }
- if (formula[i] == ')') {
- i++;
- int multiplier = GetNumber(formula, i);
- if (multiplier == 0) {
- multiplier = 1;
- }
- vector<int> statistics = ParseFormulaPart(formula_part);
- for (int i = 0; i < 26; ++i) {
- result[i] += statistics[i];
- result[i] *= multiplier;
- }
- if (!formula_parts.Empty()) {
- formula_part = formula_parts.Top();
- formula_parts.Pop();
- }
- continue;
- }
- formula_part += formula[i];
- i++;
- }
- int multiplier = GetNumber(formula, i);
- if (multiplier == 0) {
- multiplier = 1;
- }
- vector<int> v = ParseFormulaPart(formula_part);
- for (int i = 0; i < 26; ++i) {
- result[i] += v[i];
- result[i] *= multiplier;
- }
- for (int i = 0; i < result.size(); ++i) {
- if (result[i]) {
- cout << (char)('A' + i);
- if (result[i] > 1) {
- cout << result[i];
- }
- }
- }
- }
- /*
- test1
- H4ZO2
- H4O2Z
- test2
- N(OY3)2
- NO2Y6
- test3
- Z3(O(N2O3)2)3
- N12O21Z3
- test4
- ZZZ
- Z3
- test5
- (ZZZ)
- Z3
- test6
- (((ZZZ)Z)Z)Z
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement