#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct tstkStr {
char inf[200];
tstkStr *a;
};
tstkStr *AddStackStr(tstkStr *sp, char *inf) {
tstkStr *spt = new tstkStr;
strcpy(spt->inf, inf);
spt->a = sp;
return spt;
}
tstkStr *ReadStackStr(tstkStr *sp, char *inf) {
tstkStr *spt = sp;
strcpy(inf, sp->inf);
sp = sp->a;
delete spt;
return sp;
}
int isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int isVariable(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
int isNumber(char *s) {
int i = 0;
if (s[0] == '-') i++;
for (; s[i]; i++) {
if (s[i] < '0' || s[i] > '9') return 0;
}
return 1;
}
void RPNtoCpp(char *strin, char *strout) {
tstkStr *sp = NULL;
char a[200], b[200], res[200];
// Разбираем строку посимвольно
char token[100];
int j = 0;
for (int i = 0; strin[i] != '\0'; i++) {
if (strin[i] == ' ') {
if (j > 0) {
token[j] = '\0';
j = 0;
// Если токен - число или переменная
if (isNumber(token) || (strlen(token) == 1 && isVariable(token[0]))) {
sp = AddStackStr(sp, token);
}
// Если оператор
else if (strlen(token) == 1 && isOperator(token[0])) {
sp = ReadStackStr(sp, b);
sp = ReadStackStr(sp, a);
sprintf(res, "(%s %c %s)", a, token[0], b);
sp = AddStackStr(sp, res);
}
}
} else {
token[j++] = strin[i];
}
}
// Последний токен
if (j > 0) {
token[j] = '\0';
if (isNumber(token) || (strlen(token) == 1 && isVariable(token[0]))) {
sp = AddStackStr(sp, token);
}
else if (strlen(token) == 1 && isOperator(token[0])) {
sp = ReadStackStr(sp, b);
sp = ReadStackStr(sp, a);
sprintf(res, "(%s %c %s)", a, token[0], b);
sp = AddStackStr(sp, res);
}
}
// Получаем результат
char result[200];
sp = ReadStackStr(sp, result);
sprintf(strout, "double result = %s;", result);
}
int main() {
char rpn[200], cppCode[400];
cout << "Vvedite RPN virazhenie: ";
cin.getline(rpn, 200);
RPNtoCpp(rpn, cppCode);
cout << cppCode << endl;
return 0;
}