Cod sursa(job #2449469)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 19 august 2019 20:31:11
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include<iostream>
#include<fstream>
#include<stack>
#include<cstring>
using namespace std;

int precedence(char a)
{
    if(a=='+' || a=='-')
        return 1;
    if(a=='*' || a=='/')
    return 2;
    return 0;
}

int aplica(int a ,int b,char ch)
{
    if(ch=='+') return a+b;
    if(ch=='-') return a-b;
    if(ch=='*') return a*b;
    if(ch=='/') return a/b;
}


int evaluare(char token[])
{
    stack<int> values;
    stack<char> operators;
    for(int i=0;i<strlen(token);i++)
    {
        if(token[i]==' ')
            continue;
        if(isdigit(token[i]))
        {
            int val=0;
            while(i<strlen(token) && isdigit(token[i]))
            {
                val=val*10+(token[i]-'0');
                i++;
            }
            i--;
            values.push(val);
        }
        else
            if(token[i]=='(')
               operators.push(token[i]);
        else
            if(token[i]==')')
        {
            while(!operators.empty() && operators.top()!='(')
            {
                int val1,val2;
                val2=values.top();
                values.pop();
                val1=values.top();
                values.pop();
                char op=operators.top();
                operators.pop();
                values.push(aplica(val1,val2,op));
            }
            operators.pop();
        }

        else //operator
        {
            while(!operators.empty() && precedence(operators.top())>=precedence(token[i]) )
            {
                int val1,val2;
                val2=values.top();
                values.pop();
                val1=values.top();
                values.pop();
                values.push(aplica(val1,val2,operators.top()));
                operators.pop();
                //cout<<values.top()<<' ';

            }
            operators.push(token[i]);

        }

    }
    while(!operators.empty())
    {
        int val1,val2;
        val2=values.top();
        values.pop();
        val1=values.top();
        values.pop();
        values.push(aplica(val1,val2,operators.top()));
        operators.pop();
    }
    return values.top();

}


int main()
{
    ifstream fin("evaluare.in");
    char E[100000];
    fin.getline(E,100000);
    ofstream fout("evaluare.out");
    fout<<evaluare(E);
    fin.close();
    fout.close();
}