#include #include #include #include #include void superPop(std::stack&stck, double *first, double *second) { *second = stck.top(); stck.pop(); *first = stck.top(); stck.pop(); } void addition(std::stack &stck) { double nbr1, nbr2; superPop(stck, &nbr1, &nbr2); stck.push(nbr1 + nbr2); } void subtraction(std::stack &stck) { double nbr1, nbr2; superPop(stck, &nbr1, &nbr2); stck.push(nbr1 - nbr2); } void multiplication(std::stack &stck) { double nbr1, nbr2; superPop(stck, &nbr1, &nbr2); stck.push(nbr1 * nbr2); } void division(std::stack &stck) { double nbr1, nbr2; superPop(stck, &nbr1, &nbr2); if (nbr1 == 0 || nbr2 == 0) { std::cout << "Error: Can't divise by 0" << std::endl; throw std::exception(); } stck.push(nbr1 / nbr2); } int main(int argc, char **argv) { if (argc != 2) { std::cout << "Error: Number of argument is wrong" << std::endl; return 1; } std::stack stck; std::string cal(argv[1]); bool spaced = false; for (size_t i = 0; i < cal.size(); i++) { char c = cal[i]; if (spaced && c != ' ') { std::cout << "Error: Only one character by character" << std::endl; return 1; } else if (!spaced) { if (std::isdigit(c)) stck.push(std::atoi(&c)); else if (stck.size() <= 1) { std::cout << "Error: Too much operator" << std::endl; return 1; } else if (c == '+') addition(stck); else if (c == '-') subtraction(stck); else if (c == '*') multiplication(stck); else if (c == '/') { try { division(stck); } catch (std::exception &e) { return 1; } } else { std::cout << "Error: Bad Input '" << c << "'" << std::endl; return 1; } } spaced = !spaced; } double result = stck.top(); stck.pop(); if (!stck.empty()) { std::cout << "Error" << std::endl; return 1; } std::cout << result << std::endl; return 0; }