Cod sursa(job #1810452)

Utilizator ZeratulVeress Szilard Zeratul Data 20 noiembrie 2016 01:10:54
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.85 kb
#include <fstream>
#include <stack>
#include <string.h>

using namespace std;

int meret, i = 0,p = 0;
char s[1000000],q[1000000];
string ss;
stack <int> verem;

bool isoperator(char x)
{
    return (x == '+' or x == '-' or x == '*' or x == '/') ? 1:0;
}

int priority(char x)
{
    if(x == '+' or x == '-')
        return 1;
    if(x == '*' or x == '/')
        return 2;
    return 0;
}

int main()
{
    verem.push(0);
    ifstream be("evaluare.in");
    ofstream cout("evaluare.out");
    be>>ss;
    meret = ss.size();
    //cout<<meret;
    strcpy(s,ss.c_str());

    while(i < meret)
    {
        //cout<<i<<endl;
        while(s[i] == ' ')
        {
            i++;
        }

        if( isdigit(s[i]) )
        {
            while( isdigit(s[i]) )
            {
                q[p] = s[i];
                i++;
                p++;
            }
            q[p] = ' ';
            p++;
        }

        if( isoperator(s[i]) )
        {
            char n = verem.top();
            verem.pop();
            while(priority(n) >= priority(s[i]))
            {
                q[p] = n;
                p++;
                q[p] = ' ';
                p++;
                n = verem.top();
                verem.pop();
            }
            verem.push(n);
            verem.push(s[i]);
            i++;
        }

        if(s[i] == '(')
        {
            verem.push('(');
            i++;
        }

        if(s[i] == ')')
        {
            int n = verem.top();
            verem.pop();
            while(n != '(')
            {
                q[p] = n;
                p++;
                q[p] = ' ';
                p++;
                n = verem.top();
                verem.pop();
            }
            i++;
        }
    }
    while(!verem.empty())
    {
        q[p] = verem.top();
        verem.pop();
        p++;
        q[p] = ' ';
        p++;
    }

    //cout<<"\n"<<q<<endl;
    i = 0;
    p = p - 2;
    while(i < p - 1)
    {
        while(q[i] == ' ')
        {
            i++;
        }

        if( isdigit(q[i]) )
        {
            int n = 0;
            while( isdigit(q[i]))
            {
                n = n * 10 + q[i] - 48;
                i++;
            }
            verem.push(n);
        }

        if( isoperator(q[i]))
        {
            int n1,n2;
            n1 = verem.top();verem.pop();
            n2 = verem.top();verem.pop();
            switch (q[i])
            {
            case '+': verem.push(n2 + n1);break;
            case '-': verem.push(n2 - n1);break;
            case '*': verem.push(n2 * n1);break;
            case '/': verem.push(n2 / n1);break;
            }
            i++;
        }
        //cout<<verem.top()<<endl;
    }

    cout<<verem.top();

    return 0;
}