#include <iostream> #include <optional> #include <stack> #include <stdexcept> #include <climits> #include <unordered_map> #include <iterator> std::stack<int> stack; int plus(int a, int b) { return a + b; } int minus(int a, int b) { return b - a; } int produkt(int a, int b) { return a * b; } int division(int a, int b) { if (b == 0) { throw std::invalid_argument("Division durch 0!"); } return a / b; } std::unordered_map<char, decltype(&plus)> map { {'+', plus}, {'-', minus}, {'*', produkt}, {'/', division} }; int evaluate(const std::string &s) { int a,b; std::unordered_map<char, decltype(&plus)>::iterator iter; for (char c : s) { if (std::isdigit(c)) { stack.push(c - '0'); } else { if (stack.size() >= 2 ) { iter = map.find(c); if (iter != map.end()) { a = stack.top(); stack.pop(); b = stack.top(); stack.pop(); stack.push(iter->second(b, a)); } else { throw std::invalid_argument("Ungueltige Sonderzeichen"); } } else { throw std::invalid_argument("Ungueltige Anzahl an Zahlen"); } } /*switch (c) { case '+': if (stack.size() >= 2) { a = stack.top(); stack.pop(); b = stack.top(); stack.pop(); stack.push(a + b); } break; case '-': if (stack.size() >= 2) { a = stack.top(); stack.pop(); b = stack.top(); stack.pop();stack.push(b - a); } break; case '*': if (stack.size() >= 2) { a = stack.top(); stack.pop(); b = stack.top(); stack.pop();stack.push(a * b); } break; case '/': if (stack.size() >= 2) { a = stack.top(); stack.pop(); b = stack.top(); if (a == 0) { throw std::invalid_argument("Division durch 0!"); } stack.pop();stack.push(b / a); } break; default: if (std::isdigit(c)) { stack.push(c - '0'); } break; }*/ } if (stack.size() > 1 || stack.size() == 0) { throw std::invalid_argument("Ungueltige Eingabe"); } return stack.top(); } int main() { std::string user_input; std::cin >> user_input; if (user_input.empty()) { std::cout << "Empty input\n"; return 1; } std::cout << "User input is \"" << user_input << "\"\n"; int result = INT_MAX; try { result = evaluate(user_input); } catch (const std::exception &e) { std::cout << e.what(); } if (result != INT_MAX) { std::cout << "Result is: " << result << '\n'; } }