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


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