#include #include #define MAXOP 100 // Максимальный размер операдна (цифры) или оператора #define NUMBER '0' // Признак числа int getop(char[]); void push(double); double pop(void); int main() { int type; double pop2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': /* * Тут сначала извлекаем верхний операнд, из которого надо * вычитать. В отличии от `+`, `*` для `-` и `/` порядок операндов * важен. * * ---------- * - * 10 * 20 * ... * ---------- * * Чтобы сделать вычитание - надо из 20 вычесть 10 - получается * излекам со стека 10, затем 20 и делаем вычитание */ pop2 = pop(); push(pop() - pop2); break; case '/': /* * Тут примерно то-же самое, только еще надо сделать проверку * на ноль */ pop2 = pop(); if (pop2 != 0.0) push(pop() / pop2); else printf("Error: Division by zero\n"); break; case '\n': printf("\t%.g\n", pop()); break; default: printf("Error: Unknown operation %s\n", s); break; } } }