Cod sursa(job #2804198)

Utilizator OffuruAndrei Rozmarin Offuru Data 21 noiembrie 2021 09:49:29
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

stack <char> op;
stack <int> nr;
string expression;
long long p=0;

long long operation(long long x,long long y,char semn)
{
    switch(semn)
    {
    case '+':
        return x+y;
    case '-':
        return x-y;
    case '*':
        return x*y;
    case '/':
        return x/y;
    }
}

long long nextnum()
{
    long long next=0;

    while(isdigit(expression[p]))
        next=next*10+expression[p++]-'0';

    return next;
}

bool priority(char s1, char s2)
{
    if(s1=='(')
        return true;
    if((s1=='+' || s1=='-') && (s2=='*' || s2=='/'))
        return true;
    return false;
}

void calcul()
{
    do
    {
        long long nr1,nr2;
        char semn=op.top();

        nr1=nr.top();
        nr.pop();
        nr2=nr.top();
        nr.pop();
        op.pop();

        nr.push(operation(nr2,nr1,semn));
    }while(!op.empty() && priority(op.top(),expression[p])==0);
}

void evaluate()
{
    while(p<(int)expression.size())
    {
        switch(expression[p])
        {
        case '(':
            op.push(expression[p++]);
            break;
        case ')':
            while(op.top()!='(')
                calcul();
            op.pop();
            p++;
            break;
        case '+':
        case '-':
        case '*':
        case '/':
            if(op.empty() || priority(op.top(),expression[p]))
                op.push(expression[p++]);
            else
            {
                calcul();
                op.push(expression[p++]);
            }
            break;
        default:
            nr.push(nextnum());
        }
    }

    while(!op.empty() && priority(op.top(),expression[p])==0)
    {
        long long nr1,nr2;
        char semn=op.top();

        nr1=nr.top();
        nr.pop();
        nr2=nr.top();
        nr.pop();
        op.pop();

        nr.push(operation(nr2,nr1,semn));
    }

    fout<<nr.top();
}

int main()
{
    fin>>expression;
    evaluate();
    return 0;
}