Skip to content
Snippets Groups Projects
main.cpp 2.39 KiB
Newer Older
Florian Steinkamp's avatar
Florian Steinkamp committed
#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';		
	}
    
}