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


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

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

double masz[122];
char str[100], strp[100];

int priority(char ch) // Вычисление приоритета операций
{
    switch (ch)
    {
        case '(': case ')': return 0;
        case '+': case '-': return 1;
        case '*': case '/': return 2;
        case '~': return 3; // Наивысший приоритет для унарного минуса
        default: return -1;
    }
}

void AddPostFix(char *strin, char *strout)
{
    tstk *sp = NULL;
    int n = 0;
    char ch;
    double inf;

    for(unsigned int i = 0; i < strlen(strin); i++)
    {
        ch = strin[i];

        // Определение унарного минуса
        if (ch == '-' && (i == 0 || strin[i-1] == '(')) {
            ch = '~';
        }

        // Если это операнд (буквы A-Z, a-z или цифры 0-9)
        if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) { 
            strout[n++] = ch; 
            continue; 
        }

        // Если стек пуст или найдена открывающая скобка
        if (sp == NULL || ch == '(') { 
            sp = AddStack(sp, ch); 
            continue; 
        }

        // Если найдена закрывающая скобка
        if (ch == ')')
        {
            while (sp->inf != '(')
            {
                sp = ReadStack(sp, inf);
                strout[n++] = (char)inf;
            }
            sp = ReadStack(sp, inf); // Удаление открывающей скобки
            continue;
        }

        // Если операция
        int pr = priority(ch);
        while (sp != NULL && priority((char)sp->inf) >= pr)
        {
            sp = ReadStack(sp, inf);
            strout[n++] = (char)inf;
        }
        sp = AddStack(sp, ch);
    } // end for

    while (sp != NULL)
    {
        sp = ReadStack(sp, inf);
        strout[n++] = (char)inf;
    }
    strout[n++] = '\0';
}

double rasAV(char *str, double *mz)
{
    tstk *sp = NULL;
    char ch;
    double inf, inf1, inf2;

    for (unsigned int i = 0; i < strlen(str); i++)
    {
        ch = str[i];

        // Если найден операнд-переменная
        if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { 
            sp = AddStack(sp, mz[int(ch)]); 
            continue; 
        }
        
        // Если найден операнд-цифра (для примера из задания)
        if (ch >= '0' && ch <= '9') {
            sp = AddStack(sp, ch - '0');
            continue;
        }

        // Если найдена унарная операция
        if (ch == '~') {
            sp = ReadStack(sp, inf1);
            sp = AddStack(sp, -inf1); // Применяем унарный минус
            continue;
        }

        // Если найден знак бинарной операции
        sp = ReadStack(sp, inf2);
        sp = ReadStack(sp, inf1);
        switch (ch)
        {
            case '+': sp = AddStack(sp, inf1 + inf2); break;
            case '-': sp = AddStack(sp, inf1 - inf2); break;
            case '*': sp = AddStack(sp, inf1 * inf2); break;
            case '/': sp = AddStack(sp, inf1 / inf2); break;
        }
    }
    sp = ReadStack(sp, inf);
    return inf;
}

int main()
{
    // Оставлено заполнение переменных согласно оригинальному шаблону
    cout << "Vvedite a" << endl; cin >> masz[int('a')];
    cout << "Vvedite b" << endl; cin >> masz[int('b')];
    
    // Ввод выражения (можно вводить переменные a, b, цифры и унарный минус)
    cout << "Vvedite viragenie (-5+3 ili a*(-b))" << endl;
    cin >> str;

    AddPostFix(str, strp);
    cout << "OPZ: " << strp << endl;

    double s = rasAV(strp, masz);
    cout << "Res=" << s << endl;

    return 0;
}