#include #include #include #include #include #include template class StackList { private: template struct Node { T data; Node* next; Node(T _data) : data(_data), next(nullptr) {}; }; Node * top; public: StackList() { top = nullptr; } ~StackList() { while (top) { Node* toDel = top; top = top->next; delete toDel; } } void push(const T el) { if (!top) { top = new Node(el); } else { Node newEl = new Node(el); if (newEl) { newEl->next = top; top = newEl; } else { } } } bool isEmpty() const { return top == nullptr; } void pop() { if (isEmpty()) { std::cout << "Stack is empty"; return; } else { Node* toDel = top; top = top->next; delete toDel; } } T& topEl() { if (isEmpty()) { throw new _exception; } else { return top->data; } } }; int getAverage(std::vector vec) { int sum = 0; for (size_t i = 0; i < vec.size(); i++) { sum += vec[i]; } return sum / vec.size(); } int funct(std::istream& in) { std::stack opers; std::stack numbers; std::stack counters; int brackets = 0; while (in && !in.eof()) { char el = in.peek(); if (el == 'M' || el == 'm' || el == 'A') { opers.push(el); } else if (el == '(') { brackets++; opers.push(el); counters.push(0); } else if (el == ')') { brackets--; //TODO опнбепйю дюкх хлю екелемрх int elements = counters.top(); counters.pop(); char op = opers.top(); opers.pop(); assert(op == '('); //TODO опнбепйю дюкх хлю ноепюжхх op = opers.top(); opers.pop(); std::vector numbersToEval; while (elements != 0) { numbersToEval.push_back(numbers.top()); numbers.pop(); elements--; } switch (op) { case 'M': numbers.push(*std::max_element(numbersToEval.begin(), numbersToEval.end())); break; case 'm': numbers.push(*std::min_element(numbersToEval.begin(), numbersToEval.end())); break; case 'A': numbers.push(getAverage(numbersToEval)); break; default: return -1; } if (!counters.empty()) { //TODO опнбепйю дюкх хлю екелемрх int elements = counters.top(); counters.pop(); elements++; counters.push(elements); } } else if (el >= '0' && el <= '9') { int current; in >> current; numbers.push(current); //TODO опнбепйю дюкх хлю екелемрх int counter = counters.top(); counters.pop(); counter++; counters.push(counter); continue; } in.get(); } //assert(brackets == 0); if (brackets != 0) { std::cout << "Incorrect"; return -1; } //TODO опнбепйю дюкх хлю екелемрх return numbers.top(); } int main() { std::ifstream in; in.open("week5.txt"); if (in) { std::cout << funct(in); } in.close(); return 0; }