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


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

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;
        case '~': case '#': return 4;
        case '!': return 5;
        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 = '~';
        }
        if (ch == '+' && (i == 0 || strin[i-1] == '(')) {
            ch = '#';
        }

        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)
        {
            int stack_pr = priority((char)sp->inf);
            
            if (ch == '^' || ch == '~' || ch == '#') {
                if (stack_pr > pr) {
                    sp = ReadStack(sp, inf);
                    strout[n++] = (char)inf;
                } else {
                    break;
                }
            } else {
                if (stack_pr >= pr) {
                    sp = ReadStack(sp, inf);
                    strout[n++] = (char)inf;
                } else {
                    break;
                }
            }
        }
        sp = AddStack(sp, ch);
    }

    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;
        }
        if (ch == '#') {
            sp = ReadStack(sp, inf1);
            sp = AddStack(sp, inf1);
            continue;
        }
        if (ch == '!') {
            sp = ReadStack(sp, inf1);
            double fact = 1;
            for(int k = 1; k <= (int)inf1; k++) {
                fact *= k;
            }
            sp = AddStack(sp, fact);
            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;
            case '^': sp = AddStack(sp, pow(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')];
    
    cout << "Vvedite viragenie (naprimer: 2^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;
}