Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <stack>
- #include <string>
- #include <unordered_set>
- #include <vector>
- std::vector<std::string> Split(const std::string &string, const std::string &delimiter = " ") {
- std::vector<std::string> split;
- size_t prev_pos = 0;
- size_t pos = string.find(delimiter);
- while (true) {
- split.push_back(string.substr(prev_pos, pos - prev_pos));
- if (pos == std::string::npos) {
- break;
- }
- prev_pos = pos + delimiter.size();
- pos = string.find(delimiter, prev_pos);
- }
- return split;
- }
- std::pair<bool, int> EvaluateExpression(const std::vector<std::string> &expression) {
- std::unordered_set<std::string> operations{"+", "-", "*", "/"};
- std::vector<int> stack;
- for (auto element : expression) {
- int result;
- if (operations.count(element)) {
- if (stack.size() < 2) {
- return {false, 0};
- }
- auto first_el = stack.back();
- stack.pop_back();
- auto second_el = stack.back();
- stack.pop_back();
- if (element == "+") {
- result = first_el + second_el;
- } else if (element == "-") {
- result = -first_el + second_el;
- } else if (element == "*") {
- result = first_el * second_el;
- } else if (element == "/") {
- result = second_el / first_el - (first_el * second_el < 0);
- }
- } else {
- result = std::stoi(element);
- }
- stack.push_back(result);
- }
- if (stack.size() != 1) {
- return {false, 0};
- }
- return {true, stack.back()};
- }
- int main() {
- std::string expression;
- std::getline(std::cin, expression);
- auto result = EvaluateExpression(Split(expression));
- if (result.first) {
- std::cout << result.second;
- } else {
- std::cout << "ERROR";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement