#include <iostream>
#include <string.h>
using namespace std;
// Стандартная структура стека из лекционного материала [cite: 64-67]
struct tstk {
double inf;
tstk *a;
};
tstk* AddStack(tstk* sp, double inf) {
tstk* spt = new tstk;
spt->inf = inf;
spt->a = sp;
return spt;
}
tstk* ReadStack(tstk* sp, double& inf) {
tstk* spt = sp;
inf = sp->inf;
sp = sp->a;
delete spt;
return sp;
}
// Функция вычисления ОПЗ с подстановкой параметра x [cite: 41-45, 136-156]
double calculateFunction(char* rpn, double x_value) {
tstk* sp = NULL;
double inf, op1, op2;
for (unsigned int i = 0; i < strlen(rpn); i++) {
char ch = rpn[i];
// Если встречаем 'x', подставляем значение аргумента [cite: 179-180]
if (ch == 'x') {
sp = AddStack(sp, x_value);
}
// Если цифра (упрощенный ввод чисел)
else if (ch >= '0' && ch <= '9') {
sp = AddStack(sp, ch - '0');
}
// Операции из лекции [cite: 146-155]
else {
sp = ReadStack(sp, op2);
sp = ReadStack(sp, op1);
switch (ch) {
case '+': sp = AddStack(sp, op1 + op2); break;
case '-': sp = AddStack(sp, op1 - op2); break;
case '*': sp = AddStack(sp, op1 * op2); break;
case '/': sp = AddStack(sp, op1 / op2); break;
}
}
}
sp = ReadStack(sp, inf);
return inf;
}
int main() {
char func_body[100];
double argument;
// Имитация формата "f(x) = выражение"
cout << "Obyavite f(x). Vvedite viragenie v OPZ (ispolzuite 'x'): " << endl;
cout << "f(x) = ";
cin >> func_body;
// Вызов функции с числовым аргументом
cout << "Vvedite argument x dlya vizova f(x): ";
cin >> argument;
double result = calculateFunction(func_body, argument);
cout << "Resultat: f(" << argument << ") = " << result << endl;
return 0;
}