Загрузка данных


#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;
}