101 lines
1.9 KiB
C++
101 lines
1.9 KiB
C++
#include <string>
|
|
#include <stack>
|
|
#include <iostream>
|
|
#include <cctype>
|
|
#include <cstdlib>
|
|
|
|
void superPop(std::stack<double>&stck, double *first, double *second) {
|
|
*second = stck.top();
|
|
stck.pop();
|
|
*first = stck.top();
|
|
stck.pop();
|
|
}
|
|
|
|
void addition(std::stack<double> &stck) {
|
|
double nbr1, nbr2;
|
|
superPop(stck, &nbr1, &nbr2);
|
|
|
|
stck.push(nbr1 + nbr2);
|
|
}
|
|
|
|
void subtraction(std::stack<double> &stck) {
|
|
double nbr1, nbr2;
|
|
superPop(stck, &nbr1, &nbr2);
|
|
|
|
stck.push(nbr1 - nbr2);
|
|
}
|
|
|
|
void multiplication(std::stack<double> &stck) {
|
|
double nbr1, nbr2;
|
|
superPop(stck, &nbr1, &nbr2);
|
|
|
|
stck.push(nbr1 * nbr2);
|
|
}
|
|
|
|
void division(std::stack<double> &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<double> 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;
|
|
}
|