#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 isNumber(char *s) {
if (s[0] == '\0') return 0;
int i = 0;
if (s[0] == '-') i++;
int dot = 0;
for (; s[i]; i++) {
if (s[i] == '.') {
dot++;
if (dot > 1) return 0;
}
else if (s[i] < '0' || s[i] > '9') return 0;
}
return 1;
}
int isOperator(char c) {
return (c == '+' || c == '-' || c == '*'' || c == '/');
}
int isVariable(char *s) {
if (strlen(s) != 1) return 0;
char c = s[0];
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}
// Разбор строки на токены
int parseTokens(char *str, char tokens[100][100]) {
int n = 0;
int j = 0;
char token[100];
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == ' ') {
if (j > 0) {
token[j] = '\0';
strcpy(tokens[n++], token);
j = 0;
}
} else {
token[j++] = str[i];
}
}
if (j > 0) {
token[j] = '\0';
strcpy(tokens[n++], token);
}
return n;
}
void RPNtoCpp(char *strin, char *strout) {
tstkStr *sp = NULL;
char tokens[100][100];
int tokCount = parseTokens(strin, tokens);
char a[200], b[200], res[200];
for (int i = 0; i < tokCount; i++) {
char *tok = tokens[i];
// Если число
if (isNumber(tok)) {
sp = AddStackStr(sp, tok);
}
// Если переменная
else if (isVariable(tok)) {
sp = AddStackStr(sp, tok);
}
// Если оператор
else if (strlen(tok) == 1 && isOperator(tok[0])) {
sp = ReadStackStr(sp, b);
sp = ReadStackStr(sp, a);
sprintf(res, "(%s %c %s)", a, tok[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 << "=== Преобразование RPN в код C++ ===" << endl;
cout << "Vvedite RPN virazhenie s peremennimi (tokeni cherez probel): ";
cin.getline(rpn, 200);
RPNtoCpp(rpn, cppCode);
cout << endl << "C++ kod:" << endl;
cout << cppCode << endl;
return 0;
}