Cod sursa(job #2998886)

Utilizator racoltaRacolta Victor racolta Data 10 martie 2023 10:46:24
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");

char expresie[100002];
stack<int> nr;
stack<char> op;

int prioritate(char opr)
{
    if(opr=='+' || opr=='-')
    {
        return 1;
    }
    else if(opr=='*' || opr=='/')
    {
        return 2;
    }
    return 0;
}

int operatii(int nr1, int nr2, int opr)
{
    if(opr=='+')
    {
        return nr1+nr2;
    }
    if(opr=='-')
    {
        return nr1-nr2;
    }
    if(opr=='*')
    {
        return nr1*nr2;
    }
    if(opr=='/')
    {
        return nr1/nr2;
    }
}

void solveopr()
{
    int nr1=nr.top();
    nr.pop();
    int nr2=nr.top();
    nr.pop();

    char opr = op.top();
    op.pop();

    int res=operatii(nr1,nr2,opr);

    nr.push(res);
}

void solveparanteze()
{
    while(op.top()!='(')
    {
        solveopr();
    }
    op.pop();
}

int main()
{
    f >> expresie;
    int len=strlen(expresie);
    expresie[len]=')';
    expresie[len+1]=NULL;

    op.push('(');
    for(int i=0;i<=len;i++)
    {
        if(expresie[i]=='(')
        {
            op.push(expresie[i]);
        }
        else if(expresie[i]==')')
        {
            solveparanteze();
        }
        else if(expresie[i]>='0' && expresie[i]<='9')
        {
            if(i>0 && expresie[i-1]>='0' && expresie[i-1]<='9')
            {
                int st=nr.top();
                nr.pop();

                int numar = st*10+(expresie[i]-'0');
                nr.push(numar);
            }
            else
            {
                nr.push(expresie[i]-'0');
            }
        }
        else
        {
            while(prioritate(expresie[i])<=prioritate(op.top()))
            {
                solveopr();
            }
            op.push(expresie[i]);
        }
    }
    g << nr.top();

    return 0;
}